自定义结果与羽毛

时间:2017-08-16 11:59:46

标签: feathersjs

我一直在制作带羽毛的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可能会有帮助。

1 个答案:

答案 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