多个 node.js 请求

Multiple node.js requests

我的控制器正在使用 request 包向另一个 API 发出服务器端 HTTP 请求。我的问题是如何提出多个这些请求?这是我当前的代码:

** 更新代码 **

module.exports = function (req, res) {
var context = {};
request('http://localhost:3000/api/single_project/' + req.params.id, function (err, resp1, body) {
    context.first = JSON.parse(body);
    request('http://localhost:3001/api/reports/' + req.params.id, function (err, resp2, body2) {
        context.second = JSON.parse(body2); //this line throws 'SyntaxError: Unexpected token u' error
        res.render('../views/project', context);
    });
});

};

我需要再进行两次这样的调用,并将其返回的数据发送到我的模板...

有人可以帮忙吗?

提前致谢!

简单的解决方案

嵌套请求调用。这就是您处理请求之间依赖关系的方式。如果需要,只需确保您的参数在整个范围内是唯一的。

module.exports = function (req, res) {
    var context = {};
    request('http://localhost:3000/api/1st', function (err, resp1, body) {
        var context.first = JSON.parse(body);
        request('http://localhost:3000/api/2nd', function (err, resp2, body) {
            context.second = JSON.parse(body);
            request('http://localhost:3000/api/3rd', function (err, resp3, body) {
                context.third = JSON.parse(body);
                res.render('../views/project', context);
            });
        });
    });
};
function makePromise (url) {
  return Promise(function(resolve, reject) {

      request(url, function(err, resp, body) {
        if (err) reject(err);
        resolve(JSON.parse(body));
      });

  });
}

module.exprts = function (req, res) {
  let urls = ['http://localhost:3000/api/1st', 
              'http://localhost:3000/api/2st',
              'http://localhost:3000/api/3st'].map((url) => makePromise(url));

  Promise
    .all(urls)
    .then(function(result) {
      res.render('../views/project', {'first': result[0], 'second': result[1], 'third': result[2]});
    })
    .catch(function(error){
      res.end(error);
    });
}

您可以在最新的 nodejs 中使用 Promise 库。

使用 bluebird promise 库的最简单方法:

var Promise = require('bluebird');
var request = Promise.promisify(require('request'));

module.exports = function (req, res) {
  var id = req.params.id;
  var urls = [
   'http://localhost:3000/api/1st/' + id,
   'http://localhost:3000/api/2st/' + id,
   'http://localhost:3000/api/3st/' + id
  ];

  var allRequests = urls.map(function(url) { return request(url); });

  Promise.settle(allRequests)
    .map(JSON.parse)
    .spread(function(json1, json2, json3) {
      res.render('../views/project', { json1: json1 , json2: json2, json3: json3  });
    });
});

即使一个(或多个)请求失败,它也会执行所有请求