【问题标题】:NodeJS POST keeps pendingNodeJS POST 一直挂起
【发布时间】:2014-04-04 06:07:17
【问题描述】:

我正在向我的 NodeJS 后端发布一个带有 jQ​​uery 的 json 字符串,并且在我的后端处理发布数据时遇到了问题。看起来后端在某处阻塞,但我找不到在哪里。因此,我的 POSTS 将状态保持为待处理状态,有时它会返回 OK 并返回 200。

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

如果在 filterTravelInsurerCoverage 数组中找到 retValTravelInsurerList 中的项目,我只需要它们,我将填充一个新数组 (retValTravelInsurerAndCoverageList),其中存储了所有需要的项目。

如果 travelinsurercoverage 涵盖 retValTravelInsurerList 中的所有项目 => 假设 23,则 POST 状态没有问题。

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

在我看来,NodeJS 调用堆栈中仍有一些项目,它们会阻塞未来的 POST,即使 return callback();被调用。

有人知道如何解决这个问题吗?

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

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调用。动态 where 和数组短...

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

【问题讨论】:

    标签: node.js post callback mongoose callstack


    【解决方案1】:

    问题似乎与您的回调处理有关。

    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.
    

    【讨论】:

    • 你可能不知道我有多感激!现在效果很好:)
    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多