如何在 feathersjs 项目中使用 sequelizejs 创建外键

How to create foreign keys with sequelizejs in a feathersjs project

我正在使用带有 sequelize v3.29.0 的 featherjs v2.0.3,我刚刚创建了三个模型,第三个与其他两个有关系。

我使用 feathers-cli 为每个生成服务,然后编辑每个的模型文件。

到目前为止一切顺利,创建了表(使用 PostgreSQL),创建了索引,feathersjs 很好地处理了 CRUD,但还没有处理外键。

所以,当我试图告诉 feathersjs 模型之间的关系时,我遇到了麻烦。

当我将 role_permission.belongsTo(permissions) 添加到 role_permission 模型时,出现此错误: ReferenceError: permissions is not defined

正如我在 Sequelize 文档中看到的那样,模型是在相同的 "document" 中定义的,因此我怀疑问题出在某个地方,但我不明白需要做什么。

最后,这里是permissionrole_permission模型定义的相关部分:

// permission-model.js - A sequelize model

module.exports = function(sequelize) {
    const permission = sequelize.define('permissions', {
        permission_id: {
            type: Sequelize.UUID,
            defaultValue: Sequelize.UUIDV1,
            primaryKey: true,
            allowNull: false
        }...
    }, ...);

    permission.sync();

    return permission;
};

// role_permission-model.js - A sequelize model

module.exports = function(sequelize) {
    const role_permission = sequelize.define('role_permissions', {
        permission_id: {
            type: Sequelize.UUID,
            allowNull: false
        }...
    }, ...);

    role_permission.belongsTo(permissions) //<-- undefined?

    role_permission.sync();

    return role_permission;
};

你有什么建议可以帮助我解决这个问题吗? 谢谢!

您需要导入权限模型。但它可能还没有定义。

这是我在 github 上从 @mrpatiwi 那里发现的一种方法,可确保在设置关联之前加载每个模型。

首先,当您需要定义关系时,添加一个名为 associate 的类方法,它接受所有模型并设置关系。

module.exports = function(sequelize) {
  const role_permission = sequelize.define('role_permisson', {
    ...
  }, {
    classMethods: {
      associate(models) {
        role_permission.belongsTo(models.permission);
      },
    },
  });

  // Don't add role_premission.sync() here

  return role_permission;
};

然后,在src/services/index.js中module.exports函数的末尾,添加:

// Setup relationships
const models = sequelize.models;
Object.keys(models)
  .map(name => models[name])
  .filter(model => model.associate)
  .forEach(model => model.associate(models));

sequalize.sync();

我遇到了同样的问题,只需更改以下内容即可解决:

role_permission.belongsTo(permissions)

对此:

role_permission.belongsTo(models.permissions)

(我今天使用 Feathers CLI 生成模型,2018 年 8 月 9 日)