[英]Chain multiple Node http request
我是节点新手,需要从我的代码中调用第三方API。 我通过这个链接使用http.request找到了如何做到这一点https://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request 。 我需要做的是调用两个不同的api url并使用第二次调用中第一次调用的响应数据,这将只是一个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请求最受欢迎的选择。
其次,我们可以将请求的简单性与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
如您所见,我们可以根据需要添加任意数量的请求,代码将保持平稳和简单。 作为奖励,我们也能够添加错误处理。 使用传统的回调,你必须为每个回调添加错误处理,而在这里我们只需要在Promise链的末尾执行一次。
更新(09/16):虽然Promise把我们带到了中途,但是当同步,异步代码,特别是控制流(例如if-else)之间存在大量混合时,进一步的经验使我确信Promise单独变得混乱。 解决这个问题的规范方法是使用async / await ,但是仍然在开发中并需要进行转换。 因此, 发电机是下一个最佳解决方案。
使用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
更新(12/16) :既然在编写时(7.2.1)最新版本的节点支持--harmony
标志后面的async / await,你可以这样做:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.