728x90
trouble smashing log
Time: 2023-01-15 02:53
TSL-id : tsl-20230115
Problem
Express.js에 Sequelize로 DB를 연동한 뒤에, 게시글 조회 API를 호출 시 아래와 같은 에러가 발생했다.
error: SequelizeDatabaseError: Unknown column 'userId' in 'field list'
Cause
에러 코드를 직역하면 userId가 없다는 이야기다. 어딘가 userId 필드와 관련된 것 처럼 보인다. 팀원 분 한분이 스키마와 관련된 이슈인 것 같다고 하시더니, 모델 쪽에 오타인 점을 발견해주셨다.
문제의 원인은 외래키 문제였다.
Posts 모델과 N:1 관계를 맺고 있는 Users 모델의 외래키가 잘못 정의되어 있음을 확인했다. Posts와 Users 모델은 userNo라는 외래키로 연결되어야 하는데, Users는 userId로 잘못 설정되어있었던 것이다.
models/Users.js
const Sequelize = require("sequelize");
const { Model, STRING, INTEGER } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class Users extends Model {
static associate(models) {
this.hasMany(models.Posts, {
as: "Posts",
sourceKey: "userId",
foreignKey: "userId",
onDelete: "CASCADE",
});
this.hasMany(models.Answers, {
as: "Answers",
sourceKey: "userId",
foreignKey: "userNo",
onDelete: "CASCADE",
});
this.hasMany(models.Likes, {
as: "Likes",
sourceKey: "userId",
foreignKey: "userNo",
onDelete: "CASCADE",
});
}
}
Users.init(
...
);
return Users;
};
models/Posts.js
module.exports = (sequelize, DataTypes) => {
class Posts extends Model {
static associate(models) {
this.belongsTo(models.Users, {
as: 'Users',
sourceKey: 'userNo',
foreignKey: 'userNo',
onDelete: 'CASCADE',
});
this.hasOne(models.Answers, {
as: 'Answers',
sourceKey: 'postId',
foreignKey: 'postId',
onDelete: 'CASCADE',
});
this.hasMany(models.Likes, {
as: 'Likes',
sourceKey: 'postId',
foreignKey: 'postId',
onDelete: 'CASCADE',
});
}
}
Posts.init(
Solution
Users 모델의 Posts와의 외래키를 userNo로 수정해주니 정상적으로 작동된다.
Environment
"node" : "v16.17.0"
"express": "^4.18.2",
"mysql2": "^3.0.1",
"sequelize": "^6.28.0",
"sequelize-cli": "^6.5.2"
So what
모델 내 외래키가 서로 잘 맞물려있는지 항상 체크하자.
728x90
'Log > Trouble shoot' 카테고리의 다른 글
데이터베이스 컬럼에 대한 논의 (0) | 2023.02.05 |
---|---|
mongoDB 에러_ Converting circular structure to JSON (0) | 2023.01.18 |
flask_템플릿 엔진 jinja가 무엇인가 (0) | 2022.12.11 |
다중 파라미터 ajax post 요청 후 flask 서버에서 받기 (0) | 2022.12.07 |
js_inputText의 입력값 가져오기 문제(getElementById, getElementsByClassName) (0) | 2022.12.06 |
댓글