定义模型后是否需要 Model.init()?续集打字稿

时间:2021-02-18 14:15:21

标签: node.js typescript sequelize.js sequelize-typescript

在定义模型后我找不到任何关于必须使用 Model.init() 的信息,我想我做错了什么,或者我必须使用 sequelize 而不是 续集打字稿。在我尝试使用类转换器(和失败的 xd)的一段代码中,所以只需忽略它.. 所以发生的事情是 sequelize 抱怨我的模型没有定义,为了解决它,我把Model.init() 对它,我在做什么正确吗?

import { DataTypes } from 'sequelize';
import sequelize from '@shared/infra/sequelize/index';
import { Table, Model, Column } from 'sequelize-typescript';
import { Exclude } from 'class-transformer';

@Table({ tableName: 'acesso_api' })
export default class User extends Model {
  @Column({ primaryKey: true })
  id: number;

  @Column
  nome: string;

  @Column
  @Exclude()
  password: string;

  @Column
  @Exclude()
  password_hash: string;

  @Column
  cliente: string;

  @Column({ defaultValue: 0 })
  @Exclude()
  admin: number;
}

User.init(
  {
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
    },
    nome: {
      type: DataTypes.STRING(45),
    },
    password: {
      type: DataTypes.STRING(45),
    },
    password_hash: {
      type: DataTypes.STRING(100),
    },
    cliente: {
      type: DataTypes.STRING(45),
    },
    admin: {
      type: DataTypes.INTEGER(),
      defaultValue: 0,
    },
  },
  {
    tableName: 'acesso_api',
    sequelize,
  },
);

顺便说一下,这是我的默认连接的确定方式(是的,续集打字稿在查找模型时没有任何问题):

import { Sequelize } from 'sequelize-typescript';

export default new Sequelize({
  dialect: 'mysql',
  host: process.env.HOST,
  username: process.env.POLO_USERNAME,
  password: process.env.PASSWORD,
  database: 'some_DB',
  repositoryMode: true,
  models: [`${__dirname}./src/modules/**/infra/sequelize/entities/*.ts`],
  port: 3306,
  define: {
    timestamps: false,
    underscored: true,
    freezeTableName: true,
  },
});

这是如果我没有 Model.init() 它给我的错误消息(注入消息是因为 tsyringe 所以忽略它):

Server started at port 8080
Error: Cannot inject the dependency "userRepository" at position #0 of "AuthenticateUserService" constructor. Reason:
    User has not been defined
    at /home/leandro/Documents/Projetos/api/node_modules/tsyringe/dist/cjs/dependency-container.js:290:23
    at Array.map (<anonymous>)
    at InternalDependencyContainer.construct (/home/leandro/Documents/Projetos/api/node_modules/tsyringe/dist/cjs/dependency-container.js:266:34)
    at InternalDependencyContainer.resolve (/home/leandro/Documents/Projetos/api/node_modules/tsyringe/dist/cjs/dependency-container.js:105:33)
    at /home/leandro/Documents/Projetos/api/src/modules/users/infra/http/controllers/SessionController.ts:10:37
    at Generator.next (<anonymous>)
    at /home/leandro/Documents/Projetos/api/src/modules/users/infra/http/controllers/SessionController.ts:8:71
    at new Promise (<anonymous>)
    at __awaiter (/home/leandro/Documents/Projetos/api/src/modules/users/infra/http/controllers/SessionController.ts:4:12)
    at create (/home/leandro/Documents/Projetos/api/src/modules/users/infra/http/controllers/SessionController.ts:20:16)
[INFO] 10:43:09 Restarting: /home/leandro/Documents/Projetos/api/src/shared/infra/sequelize/index.ts has been modified
Debugger listening on ws://127.0.0.1:9229/d1020fa3-ae78-4f6c-ae7f-2374628c237b
For help, see: https://nodejs.org/en/docs/inspector

1 个答案:

答案 0 :(得分:0)

我想我明白了,就是这样。 “sequelize-typescript”不会自动初始化您创建的模型,因此您必须手动进行,这实际上很好,因为我可以选择何时要初始化它。目前我正在开发一个需要多个数据库连接的应用程序,并且能够在需要时随时初始化模型,这只是为我节省了一天。

相关问题