Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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
Node.js NodeJs:对请求url使用异步-Post方法在执行所有url之前发送响应_Node.js_Async.js - Fatal编程技术网

Node.js NodeJs:对请求url使用异步-Post方法在执行所有url之前发送响应

Node.js NodeJs:对请求url使用异步-Post方法在执行所有url之前发送响应,node.js,async.js,Node.js,Async.js,我有一个post方法,它的请求输入是一个newLink对象列表(带有linkUrl和status属性的newLink) 我使用async.map在我的URL上进行迭代,以检查链接是否处于活动状态 newLinks包含类似于{www.google.com、www.nourl.com、www.xyz.com}的链接。我希望在处理完所有请求并将相应状态设置为true或false后,使用res.send发送此链接(newLinks) 但控制台会给出以下结果:“www.google.com已启动”,然后调

我有一个post方法,它的请求输入是一个newLink对象列表(带有linkUrl和status属性的newLink) 我使用async.map在我的URL上进行迭代,以检查链接是否处于活动状态

newLinks包含类似于{www.google.com、www.nourl.com、www.xyz.com}的链接。我希望在处理完所有请求并将相应状态设置为true或false后,使用res.send发送此链接(newLinks)

但控制台会给出以下结果:“www.google.com已启动”,然后调用res.send(),然后执行“www.nourl.com已启动”和“www.xyz.com已启动”

基本上在这里,在第一个url请求之后,我下面的代码在异步循环之外执行函数。我认为async只允许在验证所有URL之后执行下一段代码

app.post('/myposturl', function(req , res){
var request = require('request');
let linkDetails= req.body.linkDetails;
var i = 0;
 async.map(linkDetails, function(newLink, callback) {
var Url = "url";
var url = newLink.linkUrl;
        var proxiedRequest = request.defaults({'proxy': Url});
        proxiedRequest(url , function (error, response, body) {

          if(error){
            console.log('Err: '+ error);
          }
        if (!error) {
        if(response.statusCode == 200 || response.statusCode == 201 || 
         response.statusCode == 202){
          console.log(url + ' is up!!');
          newLink.isActive = true;
        }

        if(response.statusCode == 301 || response.statusCode == 302){
          console.log(url + ' is redirecting us!!');
          return false;
        }
        }
        });
        callback();
        }  , function(err, linkDetails) {
       res.send(linkDetails);
        });
      //tried res.send here as well.
        });
    }

async.map的
回调
应该在
proxiedRequest
内部调用。代码现在正在执行的操作:在
proxiedRequest
完成之前立即调用
callback
。也
返回false在异步函数中不起作用。您应该像下面这样返回新状态
回调(null,newLink)
。处理完所有请求后,
newLinkDetails
将成为所有
newLink
的数组

注意,由于此函数并行地将iteratee应用于每个项,因此不能保证iteratee函数将按顺序完成

如果您需要维持订单,请用户安装

更多信息请阅读。希望能有帮助

app.post('/myposturl', function(req , res){
  //other codes
  async.map(linkDetails, function(newLink, callback) {
    //other codes
    proxiedRequest(url , function (error, response, body) {
        if(error){
            console.log('Err: '+ error);
            callback(error);
            //^ ^  ^  ^  ^
            // Validation failed, return from here
        }
        else {
            //some validation & set newLink.isActive

            callback(null, newLink);
            // ^   ^    ^   ^    ^
            //return newLink status by invoking the callback
        }
    });
  }, function(err, newLinkDetails) {
      //err = if any Validation failed
      // now all the request are processed,newLinkDetails is array of all newLink's
      res.send(newLinkDetails);
  });
});

通常在使用
async.js
时,我遵循以下两个原则:

  • 在异步函数期间,始终至少且最多调用一次
    回调

  • 仅当异步函数完成或出现错误时,才调用
    回调函数。如果出现后者,调用
    回调
    传递
    错误
    ,并停止进一步执行异步函数,例如
    返回回调(错误)

我将修改您的代码如下:

var request = require('request');

app.post('/myposturl', function (req , res) {
    async.mapSeries(req.body.linkDetails || [], function(newLink, callback) {
        var Url = "url";
        var proxiedRequest = request.defaults({ 'proxy': Url });
        proxiedRequest(newLink.linkUrl, function (err, response, body) {
            if (err)
                return callback(err);
            // I'm assuming you don't want to stop checking the links for bad status codes
            if ([301, 302].indexOf(response.statusCode) > -1){
                return callback(null, url + ' is redirecting us!!');
            if ([200, 201, 202].indexOf(response.statusCode) == -1) {
                return callback(null, url + ' came back with ' + response.statusCode);

            console.log(url + ' is up!!');
            newLink.isActive = true;    
            callback(null, newLink);
        });
    }, function (err, linkDetails) {
        // when all links get checked, it will come down here
        // or if an error occurs during the iteration, it will come down here
        console.log(err, linkdetails);
        res.send(linkDetails);
    });
});

如果您只想恢复活动链接,您可能还想签出。此处,
回调
需要在其第二个参数中传递一个布尔值。

尝试使用async.mapSeries。尝试过,但没有成功:(代替async.map,尝试async.series并在async.series中使用forin循环。我在我的一个应用程序中尝试了它,效果很好。我也尝试了这些,但问题是我只有在res.send之后才能得到响应,基本上它不会等待响应到达。