如何使用 Sequelize 6(和 7?)cli 生成的模型在连接模型中引用模型

How to reference models in junction model with Sequelize 6 (and 7?) cli generated models

我有一个非常简单的权限管理结构,其中我有 table 个用户和 table 个角色以及它们之间的多对多映射。这是在设置 Sequelize 的“旧”方式中工作。但是,我将要添加一些更复杂的东西,并转向定义模型的 cli/migration 模型。我想我应该先让我现有的东西以新的方式工作。

据我了解,在生成阶段无法将关联信息传递给 CLI,因此您必须手动返回并添加关联。此外,当使用此方法而不是 sync 时,您还必须为结点 table 创建一个单独的迁移文件。这可以通过生成命令来促进,但同样需要手动配置。

我已经“完成”了所有这些,因此 db:migrate 有效;但是,当我尝试在 Node.

中实际使用它时,我 运行 遇到了错误

这是 ./models 中的(修改过的)文件:

role.js:

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Role extends Model {
    static associate(models) {
      models.Role.belongsToMany(models.User, {
        through: models.UserRole
      })
    }
  }
  Role.init({
    name: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'Role',
  });
  return Role;
};

user.js:

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    static associate(models) {
      models.User.belongsToMany(models.Role, {
        through: models.UserRole
      })
    }
  }
  User.init({
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};

用户role.js:

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class UserRole extends Model {
    static associate(models) {
      // define association here
    }
  }
  UserRole.init({
    userId: {
      type: DataTypes.INTEGER,
      references: {
        model: User, // <--- this is the complaint
        key: 'id'
      }
    },
    roleId: {
      type: DataTypes.INTEGER,
      references: {
        model: Role,
        key: 'id'
      }
    }
  }, {
    sequelize,
    modelName: 'UserRole',
  });
  return UserRole;
};

这些都是用自动生成的index.js读入的。

当我用 nodemon 启动时,它会抱怨

userrole.js:20
        model: User,
               ^

ReferenceError: User is not defined

我尝试将该行修改为 model: models.User,但随后它抱怨 ReferenceError: models is not defined

我确定我在这里遗漏了一些非常简单的东西,但是,我如何将这些引用添加到结点的模型文件中?table?

FWIW,这是

sequelize@6.16.0
node v14.17.3

我在开发环境中使用 sqlite 作为方言。

最好删除 references 选项并在 associate 中定义所有链接:

static associate(models) {
       UserRole.belongsTo(models.User, { foreignKey: 'userId' });
       UserRole.belongsTo(models.Role, { foreignKey: 'roleId' });
    }