Node.js NodeJS POST一直挂起
我正在将带有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();被称为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
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.
你可能不知道我有多感激!现在效果很好:)