带有羽毛的自定义结果

Custom result with feathers

我一直在制作一个带有羽毛的 API 服务器。我有两个猫鼬服务。现在我的要求是我想要一个具有两种服务结果的 API。 假设 product-masterproduct 是两个服务。我想要的输出是合并两个服务。

为了做到这一点,我发现一种方法是挂钩。所以我尝试了这个。

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