这是我的用户模型
'use strict';
var bcrypt = require('bcrypt');
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
email: {
type: DataTypes.STRING,
validate: {
isEmail: true,
notEmpty: true,
notNull: false
},
unique: true
},
password: DataTypes.STRING,
name: DataTypes.STRING,
username: {
type: DataTypes.STRING,
unique: true
},
admin: DataTypes.BOOLEAN,
googleId: DataTypes.BOOLEAN
}, {
classMethods: {
associate: function(models) {
User.hasMany(models.Award);
User.hasMany(models.Media);
User.hasMany(models.Comment);
User.hasMany(models.Like);
User.hasMany(models.CheckIn);
}
}
});
return User;
};
这是我的媒体模型:
'use strict';
module.exports = function(sequelize, DataTypes) {
var Media = sequelize.define('Media', {
type: DataTypes.ENUM('photo', 'video'),
description: DataTypes.STRING,
url: DataTypes.STRING,
gps: DataTypes.GEOMETRY('POINT')
}, {
classMethods: {
associate: function(models) {
//Media.belongsTo(models.Event);
//Media.belongsTo(models.User);
Media.hasMany(models.Comment);
Media.hasMany(models.Like);
}
}
});
return Media;
};
我收到了这个错误:
Unhandled rejection Error: Cyclic dependency found. Users is dependent of itself.
Dependency chain: Awards -> Users -> Media => Users
以前我有一个循环依赖,它现在已被删除,但是sequelize仍会抛出此错误。为什么会这样?
如果我删除了User.hasMany(models.Media)关联,则错误将消失。但是,当媒体模型没有引用用户模型时,为什么还会发生这种情况?
答案 0 :(得分:2)
考虑使用hasMany,如下所示:
User.hasMany(models.Award, {as: 'ifYouWantAlias', constraints: false, allowNull:true, defaultValue:null});
请注意,您不需要以下部分,但我认为它更清晰。
allowNull:true, defaultValue:null
这里有很好的解释:http://docs.sequelizejs.com/en/latest/api/associations/
答案 1 :(得分:0)
设置 constraints: false
将起作用,但不会在您的数据库中创建外键。
如果您所有的数据库访问都是从 sequelize 完成的,那么这可能是一个可以接受的解决方案。但是,如果您以多种方式访问数据库,则处理起来会变得很复杂。例如:Hasura 不会在模型之间创建关系。
真正的问题是 sequelize 不够智能,无法分两步创建表格。 其他 ORM 通过首先创建没有外键的 tableA 来处理这个问题,创建 tableB 并使用外键到 tableA,然后更改 TableA 以创建 tableB 的外键。
所以解决方案是将 constraints: false
添加到您的 User.hasMany(models.Media)
然后创建然后运行外键约束。
const addMediaUserForeignKey = queryInterface.addConstraint(
'Media', {
type: 'foreign key',
onUpdate: 'CASCADE',
onDelete: 'CASCADE',
references: {
table: 'User',
field: 'id',
},
fields: [ 'userId' ]
}
).catch((e) => {})