我正在使用带有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');
}
};
我该怎么办?
答案 0 :(得分:0)
我通过在User.ts中添加以下代码来解决此问题:
User.hasOne(UserAdmin);
UserAdmin.belongsTo(User, {foreignKey: 'user_id', targetKey: 'id'});