【问题标题】:Typescript with sequelize: UserAdmin.belongsTo called with something that's not a subclass of Sequelize.Model带有 sequelize 的打字稿:UserAdmin.belongsTo 调用的东西不是 Sequelize.Model 的子类
【发布时间】:2020-12-20 19:35:55
【问题描述】:

我正在使用带有 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');
  }
};

我该怎么办?

【问题讨论】:

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


    【解决方案1】:

    我通过在我的 User.ts 中添加以下代码解决了这个问题:

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

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2020-09-21
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      相关资源
      最近更新 更多