2017-08-16 136 views
1

我一直在用羽毛制作API服务器。我有两个猫鼬服务。现在我的要求是我想要一个有两个服务的结果的API。 比方说产品大师产品是两项服务。我想要的输出是合并这两个服务。用羽毛自定义结果

为了达到这个目的,我发现一种方法就是挂钩。所以我尝试了这个。

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); 
    }); 
}); 
}; 
}; 

现在我打电话给勾上找到以前产品主的方法,但我不明白如何合并产品产品主服务的记录。

还有一件事是如何创建一个具有合并结果和自定义路线的不同API,如http://localhost:3030/products

更新

我发现了一个计算器后,this可能会有所帮助。

回答

2

对于我认为你想要做的事有不同的方式。我也建议不要直接使用这些模型,而是使用你想要的服务(通过调用他们的service methods)。你也想熟悉API for hooks。然后,你有一些选择:

1)修改现有的成果

要修改现有服务调用的结果,修改hook.resultafter钩:

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)用猫鼬$populate

Mongoose Feathers adapter还支持$populate query parameter它允许你在你在你的猫鼬模型中定义的关系拉。

欲了解羽毛协会的更多信息,请参阅this FAQ

+0

谢谢@Daff! – Rahul