繁体   English   中英

链多节点http请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM