带有羽毛的自定义结果
Custom result with feathers
我一直在制作一个带有羽毛的 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的find方法之前的钩子但是我不明白如何合并product[=31=的记录] 到 product-master 服务。
还有一件事是如何创建一个不同的 API,它具有合并结果和自定义路由,例如 http://localhost:3030/products。
更新
我在 Whosebug 上找到了一个 post, 可能会有帮助。
我认为你想做的事情有不同的方法。我还建议不要直接使用模型,而是使用你想要的服务(通过调用他们的service methods). You also want to be familiar with the API for hooks。然后你有一些选择:
1) 修改现有结果
要修改现有服务调用的结果,请在 after
挂钩中修改 hook.result
:
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-master
服务获取单个项目时添加 products
属性。
2) 设置 hook.result
要跳过数据库调用,您可以在 before
挂钩中将 hook.result
设置为您想要 return 的内容。请记住,所有 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) 使用猫鼬 $populate
Mongoose Feathers adapter also supports the $populate query parameter 允许您引入您在 Mongoose 模型中定义的关系。
有关 Feathers 中关联的更多信息,另请参阅 this FAQ。
我一直在制作一个带有羽毛的 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的find方法之前的钩子但是我不明白如何合并product[=31=的记录] 到 product-master 服务。
还有一件事是如何创建一个不同的 API,它具有合并结果和自定义路由,例如 http://localhost:3030/products。
更新
我在 Whosebug 上找到了一个 post,
我认为你想做的事情有不同的方法。我还建议不要直接使用模型,而是使用你想要的服务(通过调用他们的service methods). You also want to be familiar with the API for hooks。然后你有一些选择:
1) 修改现有结果
要修改现有服务调用的结果,请在 after
挂钩中修改 hook.result
:
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-master
服务获取单个项目时添加 products
属性。
2) 设置 hook.result
要跳过数据库调用,您可以在 before
挂钩中将 hook.result
设置为您想要 return 的内容。请记住,所有 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) 使用猫鼬 $populate
Mongoose Feathers adapter also supports the $populate query parameter 允许您引入您在 Mongoose 模型中定义的关系。
有关 Feathers 中关联的更多信息,另请参阅 this FAQ。