시퀄라이즈를 사용하고 있는 어느날,,,,
join을 위해서 include 옵션을 findAll에 주었다. 하지만!
product와 product_img가 서로 모르는 친구들이라고 한다...
분명 나는 squelize auto를 사용해서 init-models.js가 자동으로 만들어지고 그곳에서 잘 설정이
되어있다...
구글에 검색을 해봐도 외국인형들도 답을 주지 않은 상황!!
과감한 결단을 하였다.
fs.readdirSync(__dirname)
.filter((file) => {
return (
file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
);
})
.forEach((file) => {
const model = require(path.join(__dirname, file))(
sequelize,
Sequelize.DataTypes
);
db[model.name] = model;
});
우선 sequelize의 models 세팅부분에서 해당 코드가 내부의 파일을 하나하나 읽는 역할을 한다.
여기서 init-models.js의 설정을 없애려면 과감하게 init-models.js 파일을 삭제한다!
그다음
// models/index.js
// ...
const { product_img, product, wish, user } = sequelize.models;
product_img.belongsTo(product, { as: "product", foreignKey: "product_id" });
product.hasMany(product_img, {
as: "product_imgs",
foreignKey: "product_id",
});
wish.belongsTo(product, { as: "product", foreignKey: "product_id" });
product.hasMany(wish, { as: "wishes", foreignKey: "product_id" });
product.belongsTo(user, { as: "seller_user", foreignKey: "seller" });
user.hasMany(product, { as: "products", foreignKey: "seller" });
wish.belongsTo(user, { as: "user", foreignKey: "user_id" });
user.hasMany(wish, { as: "wishes", foreignKey: "user_id" });
// ...
init-models.js에서 작동되지 않는 관계를 만들어주는 코드를 작성해주면 해결!
또다른 해결 방법!
이게 근본적인 해결 방법이 아닌가 생각한다.
fs.readdirSync(__dirname)
.filter((file) => {
return (
file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
);
})
.forEach((file) => {
const model = require(path.join(__dirname, file))(
sequelize,
Sequelize.DataTypes
);
db[model.name] = model;
});
코드에서 fs로 파일을 읽어올 때 init-models.js 파일은 실행되면 안된다.
해당 코드는 모델을 설정해주는 부분인데, 이곳에서 init-models.js가 실행되면
아직 모델이 전부 설정이 되지 않은 상태에서 관계를 연결하는 것이라서 오류가 발생한 것으로 예상된다.
fs.readdirSync(__dirname)
.filter((file) => {
return (
file.indexOf(".") !== 0 &&
file !== basename &&
file !== setAssociateName &&
file.slice(-3) === ".js"
);
})
.forEach((file) => {
const model = require(path.join(__dirname, file))(
sequelize,
Sequelize.DataTypes
);
db[model.name] = model;
});
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
initModels(sequelize);
그래서 setAssociateName 이라는 변수를 만들고 값으로 init-models.js를 줘서
filter에 index.js와 함께 걸러지도록 했다.
그다음에 모든 모델 세팅이 끝나고 initModes(sequelize) 함수를 직접 실행시켜서 해결했다.
또 이렇게 세팅한 경우
// models/init-models.js
const { product_img, product, wish, user } = sequelize.models;
모델을 이렇게 불러와야 한다.