강의

멘토링

커뮤니티

Inflearn コミュニティ Q&A

cslee00342832 のプロフィール画像
cslee00342832

投稿した質問数

Node.jsにTypeScriptを適用する(feat. NodeBird)

アンビエントモジュール

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

作成

·

779

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을 아예 바꿔야 할까요?

 

nodejstypescript웹앱

回答 1

0

zerocho님의 프로필 이미지
zerocho
インストラクター

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

Chang Su Lee님의 프로필 이미지
Chang Su Lee
質問者

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)

zerocho님의 프로필 이미지
zerocho
インストラクター

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

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

Chang Su Lee님의 프로필 이미지
Chang Su Lee
質問者

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

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

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

감사합니다

cslee00342832 のプロフィール画像
cslee00342832

投稿した質問数

質問する