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

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

表

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

到目前为止,这么好,创build表(使用PostgreSQL),索引创build,feathersjs很好地照顾CRUD,但没有外键。

所以,当我试图讲述模型之间的关系的时候,我遇到了麻烦。

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

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

Feathersjs项目结构

最后,下面是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中发现的一个方法,以确保在关联build立之前加载每个模型。

首先,当你需要定义一个关系时,添加一个名为associate的classMethod来接受所有的模型并build立关系。

 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();