如何在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文档中看到的那样,模型是在同一个“文档”中定义的,因此我怀疑问题在哪里,但我不明白需要做什么。
最后,下面是permission
和role_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();