【发布时间】:2014-04-04 06:07:17
【问题描述】:
我正在向我的 NodeJS 后端发布一个带有 jQuery 的 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