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

时间:2017-02-05 01:35:32

标签: javascript node.js sequelize.js feathersjs

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

Tables

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

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

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

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

正如我在Sequelize文档中看到的那样,模型在同一个“文档”中定义,因此我怀疑问题出在那里,但我不明白需要做什么。

Feathersjs project structure

最后,这里是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;
};

你有什么指示可以帮我解决这个问题吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

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

这是我在github上从@mrpatiwi发现的一种方法,以确保在建立关联之前加载每个模型。

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

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;
};

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

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

sequalize.sync();

答案 1 :(得分:0)

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

role_permission.belongsTo(permissions)

对此:

role_permission.belongsTo(models.permissions)

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