循环依赖

and*_*pcg 5 node.js sequelize.js

这是我的用户模型

'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;
};
Run Code Online (Sandbox Code Playgroud)

这是我的媒体模型:

'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;
};
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Unhandled rejection Error: Cyclic dependency found. Users is dependent of itself.
Dependency chain: Awards -> Users -> Media => Users
Run Code Online (Sandbox Code Playgroud)

以前我有周期性依赖关系,现在已将其删除,但续集仍然会引发此错误。为什么会这样呢?

如果删除User.hasMany(models.Media)关联,错误将消失。但是,当媒体模型没有引用用户模型时,为什么仍然会发生这种情况?

ozg*_*ral 6

考虑使用 hasMany 如下:

User.hasMany(models.Award, {as: 'ifYouWantAlias', constraints: false, allowNull:true, defaultValue:null});
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要以下部分,但在我看来它更清楚。

allowNull:true, defaultValue:null
Run Code Online (Sandbox Code Playgroud)

在这里解释得很好:http : //docs.sequelizejs.com/en/latest/api/associations/


Mar*_*mon 5

设置constraints: false将起作用,但不会在数据库中创建外键。

如果所有数据库访问都是通过sequelize 完成的,那么这可能是一个可接受的解决方案。但如果您以多种方式访问​​数据库,处理起来就会变得复杂。例如:Hasura 不创建模型之间的关系。

真正的问题是,sequelize 不够智能,无法通过两步创建表。其他 ORM 通过首先创建没有外键的 tableA,使用 tableA 的外键创建 tableB,然后更改 TableA 以创建 tableB 的外键来处理该问题。

因此,解决方案是添加constraints: falseUser.hasMany(models.Media)然后创建然后运行外键约束。

    const addMediaUserForeignKey = queryInterface.addConstraint(
      'Media', {
        type: 'foreign key',
        onUpdate: 'CASCADE',
        onDelete: 'CASCADE',
        references: {
          table: 'User',
          field: 'id',
        },
        fields: [ 'userId' ]
      }
    ).catch((e) => {})
Run Code Online (Sandbox Code Playgroud)