Node Express 4在多次API调用后发送响应

时间:2015-11-04 16:50:01

标签: javascript node.js express superagent

我正在使用Express4构建NodeJS服务器。我使用此服务器作为前端角度应用程序和第三方API之间的中间人。 我创建了一个我的前端应用程序请求的特定路径,我希望在该路径上多次调用API并合并所有响应,然后发送生成的响应。 我不知道该怎么做,因为我需要等到每个API调用完成。 示例代码:

app.post('/SomePath', function(req, res) {
  var merged = [];
  for (var i in req.body.object) {
    // APIObject.sendRequest uses superagent module to handle requests and responses
    APIObject.sendRequest(req.body.object[i], function(err, result) {
      merged.push(result);
    });
  }
  // After all is done send result
  res.send(merged);
});

正如您所看到的,我在循环中调用API取决于我在请求中收到的APIObject.sendRequest的数量。

如何在完成所有操作后发送响应并合并API响应?

谢谢。

2 个答案:

答案 0 :(得分:1)

签出this answer,它使用Async模块同时发出一些请求,然后在完成后调用回调。

根据@sean的回答,我相信each会比map更合适。

它看起来像这样:

var async = require('async');
async.each(req.body.object, function(item, callback) {
  APIObject.sendRequest(item, function(err, result)) {
    if (err)
      callback(err);
    else
    {
      merged.push(result);
      callback();
    }
  }
}, function(err) {
     if (err)
       res.sendStatus(500); //Example
     else
       res.send(merged);
});

答案 1 :(得分:0)

首先,你不能在循环中执行异步方法,这是不正确的。

您可以使用the async module's map function

app.post('/SomePath', function(req, res) {
  async.map(req.body.object, APIObject.sendRequest, function(err, result) {
    if(err) {
      res.status(500).send('Something broke!');
      return;
    }
    res.send(result);
  });
});