【问题标题】:Node Express 4 send a response after multiple API callsNode Express 4 在多次 API 调用后发送响应
【发布时间】:2015-11-05 02:07:15
【问题描述】:

我正在使用 Express4 构建 NodeJS 服务器。我将此服务器用作前端 Angular 应用程序和 3rd 方 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 响应后如何发送响应?

谢谢。

【问题讨论】:

  • 问题是APIObject.sendRequest是异步的,所以for循环在实际请求完成之前就结束了?
  • 这里有很多问题,这就是其中之一。有没有其他方法可以做到这一点?

标签: javascript node.js express superagent


【解决方案1】:

查看this answer,它使用Async 模块同时发出几个请求,然后在它们都完成时调用回调。

根据@sean 的回答,我相信eachmap 更适合。

它看起来像这样:

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);
});

【讨论】:

  • 哇,这简直是疯了,它马上就起作用了:D!好东西。谢谢。您只是在 }, function(err) { 附近有一点语法错误,APIObject 有一个打开的括号,您必须关闭它。再次感谢这个异步模块!
【解决方案2】:

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

您可以使用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);
  });
});

【讨论】:

  • 不完全正确,因为map 用于更改数组的值。 each 更适合。
  • @Neta 我不知道你是什么意思?为什么你认为 map 是用来改变数组的值的?
  • map 用于将数据从一个类别转换到另一个类别,map 不应该改变数组的原始值。
  • documentation: Produces a new array of values by mapping each value in arr through the iterator function. 它遍历原始数组中的每个值,传入iterator 并更改所述值的值。最后它返回新数组。
  • 这个论点是徒劳的。我们需要知道req.body.object 的值是多少。让他尝试两种代码,看看它们是否有效。
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多