Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 POST一直挂起_Node.js_Post_Callback_Mongoose_Callstack - Fatal编程技术网

Node.js NodeJS POST一直挂起

Node.js NodeJS POST一直挂起,node.js,post,callback,mongoose,callstack,Node.js,Post,Callback,Mongoose,Callstack,我正在将带有jQuery的json字符串发布到我的NodeJS后端,并且在后端处理post数据时遇到问题。看起来后端好像在某处阻塞,但我找不到位置。因此,我的帖子保持挂起状态,有时会返回OK,返回200 下面的代码循环使用async.forEach retValTravelInsurerList,它是由23个保险公司组成的数组。我有一个嵌套的async.forEach,它用值设置构造函数,并在filterTravelInsurerCoverage中执行查询。这意味着通过Mongoose(Mong

我正在将带有jQuery的json字符串发布到我的NodeJS后端,并且在后端处理post数据时遇到问题。看起来后端好像在某处阻塞,但我找不到位置。因此,我的帖子保持挂起状态,有时会返回OK,返回200

下面的代码循环使用async.forEach retValTravelInsurerList,它是由23个保险公司组成的数组。我有一个嵌套的async.forEach,它用值设置构造函数,并在filterTravelInsurerCoverage中执行查询。这意味着通过Mongoose(MongoDB)数据库执行23个查询

我只需要在FilterTravelInsurancerOverage数组中找到RetvalTravelInsurancerList中的项目,我将填充一个新数组(RetvalTravelInsurancerAverageList),其中存储了所有需要的项目

如果TravelInsurerOverage包含retValTravelInsurerList=>中所有项目的保险范围,那么POST状态没有问题

但是,如果生成的数组(RetvalTravelInsurancerAverageList)长度小于(TravelInsurancerOverage)长度,则会出现POST问题,如果我向服务器发布了几次,Chrome的javascript控制台中的状态将保持为“挂起”

在我看来,NodeJS调用堆栈中仍然有一些项,它们阻止了将来的发布,即使返回callback();被称为

function(callback) {
  var count = 0;
  async.forEach(retValTravelInsurerList, function(item, callback1) {

    count++;

    travelinsurercoverageMdl.constructorTravelInsurerCoverage('', item._id, item.familytype,'','',this.wintersport,'',this.adventuresport, this.accidents,'','','','',this.motoristaid,'','','');
    travelinsurercoverageMdl.filterTravelInsurerCoverage(function(travelinsurercoverage, callback2){

      count--;

      async.forEach(travelinsurercoverage, function(item2, callback3) {

        retValTravelInsurerAndCoverageList.push({

          //I have shorted the list below, to 
          //get a better overview of the code
          //travel_insurer
          _id: item._id,
          name: item.name

          //travel_insurercoverage                        
          adventuresport: item2.adventuresport,
          accidents: item2.accidents,
          cashcoverageextraamount: item2.cashcoverageextraamount

          //extra fields
          familytype: item.familytype
        });

        if(count == 0) {
          return callback(); //if count is subtracted completely, then the list is finished and can be calledback to the res.send function.
        }
      }, callback1); //callback to retValTravelInsurerList to get the next item in the array.
    });
  });
}],
function(err) {
  if(err){
    return (err);
  } else {
    res.send(JSON.stringify(retValTravelInsurerAndCoverageList));
  }
});
有人知道如何解决这个问题吗

顺便说一句:我使用异步库,在返回callback()之后;调用res.send(JSON.stringify(retvalTravelInsurancerAndOverageList));被称为

function(callback) {
  var count = 0;
  async.forEach(retValTravelInsurerList, function(item, callback1) {

    count++;

    travelinsurercoverageMdl.constructorTravelInsurerCoverage('', item._id, item.familytype,'','',this.wintersport,'',this.adventuresport, this.accidents,'','','','',this.motoristaid,'','','');
    travelinsurercoverageMdl.filterTravelInsurerCoverage(function(travelinsurercoverage, callback2){

      count--;

      async.forEach(travelinsurercoverage, function(item2, callback3) {

        retValTravelInsurerAndCoverageList.push({

          //I have shorted the list below, to 
          //get a better overview of the code
          //travel_insurer
          _id: item._id,
          name: item.name

          //travel_insurercoverage                        
          adventuresport: item2.adventuresport,
          accidents: item2.accidents,
          cashcoverageextraamount: item2.cashcoverageextraamount

          //extra fields
          familytype: item.familytype
        });

        if(count == 0) {
          return callback(); //if count is subtracted completely, then the list is finished and can be calledback to the res.send function.
        }
      }, callback1); //callback to retValTravelInsurerList to get the next item in the array.
    });
  });
}],
function(err) {
  if(err){
    return (err);
  } else {
    res.send(JSON.stringify(retValTravelInsurerAndCoverageList));
  }
});
下面是filterTravelInsurerCoverage函数,由内部async.forEach调用。动态位置和阵列短路

   async.series([

    function(callback)
    {
        //define the model
        var travelinsurercoverageModel = conn.model('travel_insurercoverages', schema);

        //define the query
        var query = travelinsurercoverageModel.find();

        //build dynamic where
        if(utilnull.isItemNullValue(locals._cancellation3000))
        { query.where({'Cancellation3000': {'$gte' : 0}}); }
        if(utilnull.isItemNullValue(locals._motoristaid))
        { query.where({'MotoristAid': {'$gte' : 0}}); }
        if(utilnull.isItemNullValue(locals._businesstravel))
        { query.where({'BusinessTravel': {'$gte' : 0}}); }
        if(utilnull.isItemNullValue(locals._extendedtravelperiod))
        { query.where({'ExtendedTravelPeriod': {'$gte' : 0}}); }
        if(utilnull.isItemNullValue(locals._extendedtravelprice))
        { query.where({'ExtendedTravelPrice': {'$gte' : 0}}); }

        //execute query
        query.exec(function (err, reis) {
            if (err) return callback(err);

            reis.forEach(function(item) {

                retVal.push({
                    _id: item.id,
                    insuranceidref: item.InsuranceIDREF,
                    familytype: item.FamilyType,
                    basepriceeurope: item.BasePriceEurope,
                    businesstravel: item.BusinessTravel,
                    extendedtravelperiod: item.ExtendedTravelPeriod,
                    extendedtravelprice: item.ExtendedTravelPrice
                });
            });
            callback();
        })
    }
    ],
    function(err)
    {
        if(err){
            return err;
        }
        else {
            callback(retVal);
        }
    }
    );

问题似乎来自您的回调处理

async.forEach的使用方式如下:

async.forEach(array, function(item, next) {
  // do stuff with item, which comes from the array
  next();
  // ALWAYS invoke next(). If you have an error and need to stop the processing, pass an error argument
}, function(err) {
  // end callback, invoked when all item where processed, of when an error is reported
});
forEach
将并行处理您的资料。如果需要停止它们,请调用带有错误的
next
,将调用结束回调,而不会触发其他未处理的项

您决不能通过使用
return
、抛出错误或调用父作用域中的另一个回调来中断此工作流

——编辑--

例如,您可以有如下内容:

function(callback) {

  async.forEach(retValTravelInsurerList, function(item, next1) {

    travelinsurercoverageMdl.constructorTravelInsurerCoverage('', item._id, item.familytype,'','',this.wintersport,'',this.adventuresport, this.accidents,'','','','',this.motoristaid,'','','');

    // here is an asynchronous processing: next1 will be invoked when it ends
    travelinsurercoverageMdl.filterTravelInsurerCoverage(function(travelinsurercoverage, callback2){

    async.forEach(travelinsurercoverage, function(item2, next2) {

      retValTravelInsurerAndCoverageList.push({

        //I have shorted the list below, to 
        //get a better overview of the code
        //travel_insurer
        _id: item._id,
        name: item.name

        //travel_insurercoverage                        
        adventuresport: item2.adventuresport,
        accidents: item2.accidents,
        cashcoverageextraamount: item2.cashcoverageextraamount

        //extra fields
        familytype: item.familytype
      });
      // item2 processing is finished: let nested async.forEach knows about it
      next2();
    }, next1); // when all item2 in travelinsurercoverage are processed, let first async.forEach knows about it
  }, callback); // when all item in retValTravelInsurerList are processed, your overall processing is ok.

你可能不知道我有多感激!现在效果很好:)