2016-08-04 75 views
1

我正在用Apollo服務器封裝較舊的REST API服務。調用REST服務會產生一個JSON對象,它將有效負載嵌套到2到3級的深度。例如:Apollo服務器 - 解析連接器,解析器或模型中的REST結果

{ 
    - MRData: { 
     - CatTable : { 
      - Cats : [] 

而且更復雜的是,每個資源端點的嵌套模式和節點名稱都不相同。所以我的問題是,因爲每個資源結果都需要自定義操作,所以最好的地方在哪裏做:在連接器,解析器或模型中。

連接器

如果連接完成,則需要爲每個資源的自定義方法。看起來像很多樣板。

public fetchCats(resource: string) {  
    return new Promise<any>((resolve, reject) => { 
     request.get(url, (err, resp, body) => { 
     err ? reject(err) : resolve(JSON.parse(body).MRData.CatTable.Cats) 
     }) 
     }) 
    } 

解析器

解析器方法接收的希望,但是結果不能被操縱:

const allCats = (_, params, context) => context.cat.getCats() 
.then((data) => { // to late to manipulate data here }) 

型號

模型看起來很有希望,但不太清楚如何構造它:

public getCats() { 
    const cats = this.connector.fetchCats('/cats.json'); 
    return cats; 
    } 

Apollo將(通常是)與REST API集成。我期待着發現處理這種情況的最佳方式。

回答

2

我通常會建議在連接器中進行解析,因爲它們應該對後端的細節進行抽象。如果連接器在後端進行抽象,那麼技術上應該能夠在適當的時候將另一個後端切換爲另一個後端。例如,您可以從查詢REST API切換到將數據直接發送到數據庫的地方。

這樣做的後果是您需要爲每個REST API構建一個新的連接器,因爲沒有兩個REST API是相同的。

+0

您提出了一個抽象層的好點。因此,解決方案將爲每個資源類型構建一個fetch()和fetchPage(),因爲這個特定的REST API會爲每個資源創建一個自定義節點名稱。 – jboothe

+0

或者更好的做法是將resource_type參數傳遞給fetch() - 類似於'fetch(url,resourceType)'',然後創建類似於'CAT_TYPE =「MRData.CatTable.Cats」'和'DOG_TYPE =「MRData.DogTable.Dogs」整理出每個資源使用的分析結構。 – jboothe