• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Sequelize에 요청을 보내면 오류가 뜹니다

23.01.17 00:50 작성 조회수 530

0

수업 보면서 포트폴리오를 작성하고 있습니다...

Sequelize를 통해서 DB에 POST요청을 보내면

TypeError: Class constructor Model cannot be invoked without 'new'

라는 오류가 발생합니다.

Typescript의 버전이 ES6가 아닐 때 시퀼라이즈에서 이러한 오류가 발생한다고 해서 tsconfig에 'target' = 'ES6' 로 지정하니 그때부터 강의를 기반으로 만들어온 모듈 import가 전부 어긋나게 됩니다...

메인페이지의 import * as ... 구문은 어떻게든 수정하겠는데 현재 강의 방식이 아닌 Typescript DB작성 방식을 모르기 때문에 어디서부터 손을 대야 할지도 모르겠습니다

ES6모듈로 전환하지 않고 해당 오류를 해결할 방법이 있을까요? 아니면 ORM을 아예 바꿔야 할까요?

 

답변 1

답변을 작성해보세요.

0

모델 코드를 어떻게 작성하셨나요? 강좌가 오래돼서 옛날 코드일 가능성이 높습니다.

index

import User, { associate as associateUser } from "./user";
import Bookmark, { associate as associateBookmark } from "./bookmark";
import Comment, { associate as associateComment } from "./comment";
import Hashtag, { associate as associateHashtag } from "./hashtag";
import Image, { associate as associateImage } from "./image";
import Post, { associate as associatePost } from "./post";
import Schedule, { associate as associateSchedule } from "./schedule";

/* Export */
export * from "./sequelize";

/* Relationship */
const db = {
  Bookmark,
  Comment,
  Hashtag,
  Image,
  Post,
  Schedule,
  User,
};

export type dbType = typeof db;

associateBookmark(db);
associateComment(db);
associateHashtag(db);
associateImage(db);
associatePost(db);
associateSchedule(db);
associateUser(db);

 

sequelize.ts

 

import { Sequelize } from "sequelize";
import config from "../config/config";

/* Env type annotation */
const env =
  (process.env.NODE_ENV as "production" | "test" | "development") ||
  "development";

/* DB connect information */
const { database, username, password } = config[env];
const sequelize = new Sequelize(database, username, password, config[env]);

export { sequelize };
export default sequelize;

 

user.ts

import { Model, DataTypes } from "sequelize";
import { dbType } from "./index";
import { sequelize } from "./sequelize";
import Bookmark from "./bookmark";
import Schedule from "./schedule";
import Post from "./post";

class User extends Model {
  /* User */
  public readonly id!: number;
  public email!: string;
  public password!: string;
  public nickname!: string;
  public readonly createdAt!: Date;
  public readonly updatedAt!: Date;

  /* Relationship */
  public readonly Bookmarks?: Bookmark[];
  public readonly Schedules?: Schedule[];
  public readonly Posts?: Post[];
  public readonly Followers?: User[];
  public readonly Followings?: User[];

  /* GET SET Methods */
}

User.init(
  {
    email: {
      type: DataTypes.STRING(20),
      allowNull: false,
      unique: true,
    },
    password: {
      type: DataTypes.STRING(100),
      allowNull: false,
    },
    nickname: {
      type: DataTypes.STRING(20),
      allowNull: true,
    },
  },
  {
    sequelize,
    modelName: "User",
    tableName: "user",
    charset: "utf8",
    collate: "utf8_general_ci",
  }
);

export const associate = (db: dbType) => {
  db.User.hasMany(db.Bookmark, { foreignKey: "Users", sourceKey: "id" });
  db.User.hasMany(db.Schedule, { foreignKey: "Users", sourceKey: "id" });
  db.User.hasMany(db.Post, { foreignKey: "Users", sourceKey: "id" });
  db.User.belongsToMany(db.User, {
    through: "Follow",
    as: "Follower",
    foreignKey: "followingId",
  });
  db.User.belongsToMany(db.User, {
    through: "Follow",
    as: "Followings",
    foreignKey: "followerId",
  });
};

export default User;

입니다

 

[0] { email: '', password: '', confirmPassword: '', nickname: '' }

[0] Executing (default): SELECT id, email, password, nickname, createdAt, updatedAt FROM user AS User WHERE User.`email` = '';

[0] TypeError: Class constructor Model cannot be invoked without 'new'

[0] at new User (C:\workspace\Dev-Mark\server\models\user.js:24:42)

[0] at Function.build (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:2167:12)

[0] at Function.create (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:2220:17)

[0] at C:\workspace\Dev-Mark\server\routes\auth.js:82:56

[0] at step (C:\workspace\Dev-Mark\server\routes\auth.js:44:23)

[0] at Object.next (C:\workspace\Dev-Mark\server\routes\auth.js:25:53)

[0] at fulfilled (C:\workspace\Dev-Mark\server\routes\auth.js:16:58)

[0] POST /auth 500 246.600 ms - 816

[0] TypeError: Class constructor Model cannot be invoked without 'new'

[0] at new User (C:\workspace\Dev-Mark\server\models\user.js:24:42)

[0] at Function.build (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:2167:12)

[0] at Function.create (C:\workspace\Dev-Mark\server\node_modules\sequelize\lib\model.js:2220:17)

[0] at C:\workspace\Dev-Mark\server\routes\auth.js:82:56

[0] at step (C:\workspace\Dev-Mark\server\routes\auth.js:44:23)

[0] at Object.next (C:\workspace\Dev-Mark\server\routes\auth.js:25:53)

[0] at fulfilled (C:\workspace\Dev-Mark\server\routes\auth.js:16:58)

요즘은 시퀄라이즈 타입스크립트 코드를 다음과 같은 식으로 작성합니다.

https://github.com/ZeroCho/nodejs-book/tree/master/ch17/17.4/nodebird/models

늦은 시간에 답변 감사합니다 ㅠ

일단 손대기 힘든 Sequelize와 모델을 지우고 나머지를 전부 ES6 import로 전환했습니다

보내주신 코드 따라서 다시 DB 설계해보고 정 모르겠으면 질문 하겠습니다

감사합니다