带有sequelize的打字稿:UserAdmin.belongsTo用不是Sequelize.Model

时间:2020-09-01 16:34:12

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

我正在使用带有typescript的sequelize,当我试图在两个模型之间创建关联时遇到了这个错误...

错误:UserAdmin.belongsTo调用的不是Sequelize.Model的子类。

这是我的代码:

User.ts模型:

import  Sequelize, {Model, Association}  from 'sequelize';
const bcrypt = require('bcrypt');
const connection =  require('../../database');
const jwt = require('jsonwebtoken');
import UserClient from './UserClient';
import UserAdmin from './UserAdmin';
class User extends Model{
    public id!: number;
    public name!: string;
    public email!: string;
    public password!: string;
    public receive_email!:boolean;
    public image!:string | null;

    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;
    
    public async checkPassword(password: string): Promise<boolean> {
        return bcrypt.compare(password, this.password);
      }

      public async generateToken(){
          return jwt.sign({id: this.id}, process.env.APP_SECRET, {
              expiresIn: 86400,
          });
        }

      
    
}


User.init(
    {
    name: Sequelize.STRING,
    email: Sequelize.STRING,
    password: Sequelize.STRING,
    receive_email:Sequelize.BOOLEAN,
    image:Sequelize.STRING,

},
{
    sequelize: connection,
    underscored:true,
    modelName: 'User'
}, 
);


User.addHook(
    'beforeSave', async(user:User) =>{
        if(user.password){
            user.password = await bcrypt.hash(user.password,8);
        }
    },
);


export default User;

UserAdmin.ts模型:

import  Sequelize, {Model, Association}  from 'sequelize';
const bcrypt = require('bcrypt');
const connection =  require('../../database');
const jwt = require('jsonwebtoken');
import User from './User';

class UserAdmin extends Model{
    public id!:number;
    public user_id!: number;
    public access_level!: number;
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;

}

UserAdmin.init(
    {
    user_id: {
        type: Sequelize.INTEGER,
        references: {model: 'users', key:'id'},
        onDelete: 'CASCADE'
    },
    access_level: Sequelize.INTEGER,
},
{
    sequelize: connection,
    underscored:true,
    modelName: 'UserAdmin',
}
);

UserAdmin.belongsTo(User);


export default UserAdmin;

迁移:

用户迁移:

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
  
     await queryInterface.createTable('users', { 
       id: {
         type: Sequelize.INTEGER,
         primaryKey: true,
         autoIncrement: true,
         allowNull: false,
       },
       name: { 
         type: Sequelize.STRING,
         allowNull: false,
       },
       email: {
         type: Sequelize.STRING,
         allowNull: false,
         unique:true
       },
       password: {
         type: Sequelize.STRING,
         allowNull: false,
       },
       receive_email:{
         type: Sequelize.BOOLEAN,
         defaultValue: true,
       },
      image:{
        type:Sequelize.STRING,
        allowNull:true,
      },
       created_at: {
         type: Sequelize.DATE,
         allowNull: false,
       },
       updated_at:{
         type: Sequelize.DATE,
         allowNull: false,
       }
      
      });
  },

  down: async (queryInterface, Sequelize) => {

    await queryInterface.dropTable('users');
    
  }
};

user_admins迁移:

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('user_admins', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      user_id: {
        type: Sequelize.INTEGER,
        allowNull:false,
        references: {
          model: 'users',
          key: 'id',
          onUpdate: 'CASCADE',
          onDelete:'CASCADE'
        }
      },
      access_level: {
        type: Sequelize.INTEGER,
        allowNull:false,
      },
      created_at: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updated_at: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('user_admins');
  }
};

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我通过在User.ts中添加以下代码来解决此问题:

User.hasOne(UserAdmin);

UserAdmin.belongsTo(User, {foreignKey: 'user_id', targetKey: 'id'});