在帮助很多人解决同样的问题后,我了解到解决方案分为两部分:
#1 - 拥抱 ORM
人们的大部分问题都来自于对sequelize缺乏了解。为了帮助您,您首先需要了解如何续集关联 http://docs.sequelizejs.com/en/latest/docs/associations/工作以及如何使用执行查询“包含”选项 http://docs.sequelizejs.com/manual/tutorial/models-usage.html#eager-loading(又名“渴望加载”)。我建议您将这些链接的所有内容阅读几次,然后再阅读一次以达到更好的效果;这是续集学习曲线中最陡峭的部分。如果您从未使用过 ORM,请让它为您完成许多繁重的工作!
#2 - 从羽毛钩子设置续集选项
一旦您了解了“include”选项如何与sequelize配合使用,您将需要从fees中的“before”钩子中设置该选项。羽毛将传递价值hook.params.sequelize作为选项参数 https://docs.feathersjs.com/api/databases/sequelize.html#paramssequelize对于所有的sequelize方法调用。你的钩子可能是这样的:
// GET /my-service?name=John&include=1
function (hook) {
if (hook.params.query.include) {
const AssociatedModel = hook.app.services.fooservice.Model;
hook.params.sequelize = {
include: [{ model: AssociatedModel }]
};
// delete any special query params so they are not used
// in the WHERE clause in the db query.
delete hook.params.query.include;
}
return Promise.resolve(hook);
}
在引擎盖下,羽毛会召唤您的模特find
方法有点像这样:
// YourModel is a sequelize model
const options = Object.assign({ where: { name: 'John' }}, hook.params.sequelize);
YourModel.findAndCount(options);
值得注意的是:
旧的 v1.x 羽毛生成器(2017 年 3 月之前)不会生成对续集友好的代码。这已在新的 v2.x 生成器中得到修复。如果您在 2017 年 3 月之前就已深入开展项目,那么do not使用新的发电机。请加入松弛通道 http://slack.feathersjs.com/并加入sequelize
寻求帮助的空间。我会关注那里的情况并可以帮助你。如果您刚刚开始您的项目并且还没有取得很大进展,那么我强烈建议您使用新的生成器重新开始。运行此命令(并按照这些说明 https://github.com/feathersjs/cli):
$ feathers --version # see what version you are using
$ npm install -g @feathersjs/cli # install latest version of the CLI