2017-08-25 23 views
0

你好傢伙我目前在嘗試解決這個問題時遇到問題,所以我正在使用https://newsapi.org/ API試圖從多個來源獲取數據,但我目前遇到了麻煩一種方式&解析它到EJS我可以做一個api源但不是多個這是甚至可能的。使用Node Js從多個API中檢索並解析到EJS文件

這是我設法拿出這麼遠

app.get("/", function(req, res){ 
    request("https://newsapi.org/v1/articles?source=the-new-york-times&sortBy=top&apiKey=70a5906f19f844f291cff401c80bc123", function(error, response,body){ 
     if(! error && response.statusCode == 200) { 
      var data = JSON.parse(body); 
      res.render("results", {data: data}); 
     } 
    }); 
}); 
+0

'results.ejs'的內容是什麼。另外,有什麼問題? – styfle

+0

問題是我不知道如何從多個來源拉動 EJS文件看起來像這樣

<%= news [「title」]%>

luibot

+0

我不理解這個問題。你還包括你的API密鑰,所以你現在應該停用它。我能夠獲取[json](https://gist.github.com/styfle/21ddf5eaaa7296c1f030f4624989f55c)。 – styfle

回答

0

你可以讓一個單獨的函數,從一個URL獲取數據並返回一個承諾。當承諾解決時,它將擁有JSON對象。然後,您可以按照您的喜好渲染數據。

這裏是一個例子,我從三個不同的URL獲取3個結果。我正在使用Promise.all在操作數據之前等待所有3個請求的響應。

function fetchJSON(url) { 
    return new Promise((resolve, reject) => { 
    request(url, function(err, res, body) { 
     if (err) { 
     reject(err); 
     } else if (res.statusCode !== 200) { 
     reject(new Error('Failed with status code ' + res.statusCode)); 
     } else { 
     resolve(JSON.parse(body)); 
     } 
    }); 
    }); 
} 

app.get("/", function(req, res) { 
    const p1 = fetchJSON('http://example.com/one'); 
    const p2 = fetchJSON('http://example.com/two'); 
    const p3 = fetchJSON('http://example.com/three'); 

    Promise.all([p1, p2, p3]).then((data) => { 
    res.render("results", { 
     data_one: data[0], 
     data_two: data[1], 
     data_three: data[3] 
    }); 
    }).catch(err => console.error('There was a problem', err)); 
}); 

需要注意的是,你可以做任何你想用data陣列。在渲染過程中,我將它分成三個獨立的屬性,以顯示真正有3個結果。

+0

謝謝,這似乎達到了我想要做的。 ! +1 – luibot

+0

更新,我在 「data_one:data [0]」,「 」如何過濾每個關鍵字的api結果? – luibot

+0

請參閱[Array.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)瞭解如何過濾對象數組。 – styfle