2017-08-16 135 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