链多个节点http请求

我是新来的节点,需要从我的代码调用第三方api。 我发现如何通过使用http.request这个链接https://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request 。 我需要做的是调用两个不同的APIurl,并在第二次调用中使用第一个调用的响应数据,这只是一个id作为resource2上的参数。

我不知道如何将这两个电话连接在一起,而不是一个重复的混乱。 任何帮助,将不胜感激。

var url1 = { host: 'www.domain.com', path: '/api/resourse1' }; var url2 = { host: 'www.domain.com', path: '/api/resourse2/{id}' }; var callback = function (response) { var str = ''; response.on('data', function (chunk) { str += chunk; }); response.on('end', function () { console.log(str); }); } http.request(url1, callback).end(); 

首先,你会想看看请求 ,这是HTTP请求最stream行的select,因为它的简单性。

其次,可以将请求的简单性和Promises的概念结合起来,在保持代码平坦的前提下,连续发出多个请求。
使用请求 – 承诺

 var rp = require('request-promise') var url1 = {} var url2 = {} var url3 = {} rp(url1) .then(response => { // add stuff from url1 response to url2 return rp(url2) }) .then(response => { // add stuff from url2 response to url3 return rp(url3) }) .then(response => { // do stuff after all requests // If something went wrong // throw new Error('messed up') }) .catch(err => console.log) // Don't forget to catch errors 

正如你所看到的,我们可以添加尽可能多的请求,代码将保持平坦和简单。 作为奖励,我们也能够添加error handling。 使用传统的callback,你必须在每个callback中添加error handling,而在这里我们只需要在Promise链的末尾添加一次。

更新(09/16):虽然承诺带我们走了一半,但是进一步的经验让我相信,当同步,asynchronous代码,尤其是控制stream(例如if-else)之间混合很多时,Promise本身就会变得混乱。 解决这个问题的标准方法是asynchronous/等待 ,但是这仍然在发展中,需要进行转换。 因此, 发电机是下一个最好的解决scheme。

使用co

 var co = require('co') var rp = require('request-promise') var url1 = {} var url2 = {} var url3 = {} co(function* () { var response response = yield rp(url1) // add stuff from url1 response to url2 response = yield rp(url2) // add stuff from url2 response to url3 response = yield rp(url3) // do stuff after all requests // If something went wrong // throw new Error('messed up') }) .catch(err => console.log) // Don't forget to catch errors 

UPDATE(12/16) :现在写入时最新版本的节点(7.2.1)支持--harmony标志后的asynchronous/等待,你可以这样做:

 const rp = require('request-promise') const url1 = {} const url2 = {} const url3 = {} async function doRequests() { let response response = await rp(url1) // add stuff from url1 response to url2 response = await rp(url2) // add stuff from url2 response to url3 response = await rp(url3) // do stuff after all requests // If something went wrong // throw new Error('messed up') } doRequests() .catch(err => console.log) // Don't forget to catch errors