我一直在制作带羽毛的API服务器。我有两个猫鼬服务。现在我的要求是我想要一个具有两种服务结果的API。 假设 product-master 和 product 是两项服务。我想要的输出是合并两个服务。
为了实现这一点,我发现一种方法是钩子。所以我尝试了这个。
module.exports = function () {
return function (hook) {
let Product = hook.app.service('product').Model;
return new Promise(function(resolve, reject){
Product.find({}, function(err, products) {
var productMap = [];
products.forEach(function(product) {
productMap.push(products);
});
res.send(productMap);
console.log(productMap);
resolve(hook);
});
});
};
};
现在我在找到 product-master 的方法之前调用了钩子但是我不明白如何将产品的记录合并到 product-master 服务。
还有一件事是如何创建一个具有合并结果和自定义路线的不同API,如http://localhost:3030/products。
更新
我在stackoverflow上发现了一篇帖子,this可能会有帮助。
答案 0 :(得分:4)
我认为你想做的事情有不同的方法。我还建议不要直接使用模型,而是使用你想要的服务(通过调用他们的service methods)。您还想熟悉API for hooks。然后你有一些选择:
1)修改现有结果
要修改现有服务调用的结果,请修改hook.result
挂钩中的after
:
module.exports = function () {
return function (hook) {
let productService = hook.app.service('product');
return productService.find({
paginate: false // Turn off pagination
}).then(products => {
hook.result.products = products;
return hook;
});
};
};
然后
const myHook = require('../../hooks/myhook');
app.service('products-master').hooks({
after: {
get: [ myHook() ]
}
});
从products
服务获取单个项目时,这会添加products-master
属性。
2)设置hook.result
要跳过数据库调用,您可以将hook.result
设置为要在before
挂钩中返回的内容。请记住,所有after
挂钩仍会运行。
3)使用自定义服务
在custom service中你可以做任何你喜欢的事情,例如获取你需要的所有东西并将它们拼凑起来:
app.use('/all-products', {
find() {
return this.app.service('products-master').find(params).then(page => {
const promises = page.data.map(masterProduct => {
return this.app.service('products').find({
paginate: false,
query: {
masterProductId: masterProduct._id
}
}).then(products => {
// Add to masterProduct
masterProduct.products = products;
});
});
return Promise.all(promises).then(() => {
// Return `page` which has the modified data
return page;
});
});
},
setup(app) {
this.app = app;
}
});
在生成器中,可以通过选择custom service
并修改servicename.class.js
来创建自定义服务。
4)填充钩
由于我认为您只想填充相关实体,您还可以查看populate common hook。它可以自动完成这些事情。
5)使用Mongoose $populate
Mongoose Feathers adapter还支持$populate query parameter,它允许您提取您在Mongoose模型中定义的关系。
有关Feathers中关联的更多信息,请参阅this FAQ。