본문 바로가기
Log/Trouble shoot

Expres.js_SequelizeDatabaseError Unknown column 'userId' in 'field list'

by RIEM 2023. 1. 15.
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

댓글