Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node Express 4在多次API调用后发送响应_Javascript_Node.js_Express_Superagent - Fatal编程技术网

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

Javascript Node Express 4在多次API调用后发送响应,javascript,node.js,express,superagent,Javascript,Node.js,Express,Superagent,我正在使用Express4构建一个NodeJS服务器。我使用这个服务器作为前端angular应用程序和第三方API之间的中间人。 我创建了前端应用程序请求的特定路径,我希望在该路径上多次调用API,合并所有响应,然后发送结果响应。 我不知道该怎么做,因为我需要等到每个API调用完成。 示例代码: app.post('/SomePath', function(req, res) { var merged = []; for (var i in req.body.object) {

我正在使用Express4构建一个NodeJS服务器。我使用这个服务器作为前端angular应用程序和第三方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响应后,如何发送响应

谢谢。

签出,它使用
Async
模块同时发出几个请求,然后在所有请求完成后调用回调

根据@sean的回答,我相信
每一个
都比
地图
更合适

然后它会像这样:

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

首先,不能在循环中使用异步方法,这是不正确的

你可以用


问题在于
APIObject.sendRequest
是异步的,因此
for
循环在实际请求完成之前结束?这里有很多问题,这就是其中之一。是否有其他方法可以做到这一点?不完全正确,因为
map
用于更改数组的值
每种
都会更合适。@Neta我不知道你的意思是什么?为什么您认为map用于更改数组的值?map用于将数据从一个类别转换为另一个类别,map不应更改数组的原始值。从:
通过迭代器函数映射arr中的每个值,生成一个新的值数组。
它遍历原始数组中的每个值,传递到
迭代器,并更改所述值。最后返回新数组。参数无效。我们需要知道
req.body.object
的值是多少。让他试试这两种代码,看看它们是否有效。哇,伙计,这简直太疯狂了,它立刻就起作用了:D!不错。Thnx。您只是在},函数(err){附近有一个小语法错误,APIObject有一个打开的括号,您必须关闭它!
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);
  });
});