我是node / javascript的新手,所以我的问题可能很简单,但它给我带来了麻烦。
我有以下代码。它成功检查数据库中的Unit
和Owner
值。问题是if语句else if (Owner){
之后的代码按预期执行,但是,程序永远不会到达return reply(output);
行,我认为应该这样做。
我认为这是我从Owner.findOne(...
代码回来的方式。
谁能看到我做错了什么?
exports.sale = {
tags: ['api'],
validate : {
//blah blah blah
},
handler : function(request, reply) {
var output = {
success: true,
operations: [],
epoch: Date.now()
};
Unit.findById(request.payload.deviceNumber, function(err, device) {
if (err) {
//blah blah blah
}
if (device) {
Owner.findOne({OwnerId: device.Owner}, function(err, Owner) {
if (err) {
//blah blah blah
}
else if (Owner){
//make changes to output.operations
}
});
} else {
output.success = false;
}
return reply(output);
});
}
};
答案 0 :(得分:1)
代码中存在几个问题。
首先,假设if (err)
子句没有相同的return reply(output)
语句,这意味着无论return(output)
是异步的,您的代码都会始终执行Unit.findById
。也就是说,代码不会等待Unit.findById
的响应完成,只要它调用它,代码就会继续并最终点击return
语句。
其次,Owner.findOne
在回调函数的代码块中应该有自己的return
语句,因为代码只会在其中传播。
因此,对于Happy.findOne和Unit.findById成功执行的快乐路径案例,您仍会收到output.success = false
的回复。
因此,忽略代码可读性,解决问题 - 您的代码看起来应该是这样的。
Unit.findById(request.payload.deviceNumber, function(err, device) {
if (err) {
//blah blah blah
output.success = false;
return reply(output);
}
if (device) {
Owner.findOne({OwnerId: device.Owner}, function(err, Owner) {
if (err) {
//blah blah blah
output.success = false;
return reply(output);
}
else if (Owner){
//make changes to output.operations
}
output.success = true;
return reply(output);
});
} else {
output.success = false;
return reply(output);
}
});
答案 1 :(得分:0)
Owner.findOne
是另一个异步函数,因此您需要将reply(output)
移动到output.success = false;
的else块中,并在{{{}}的回调中添加另一个reply(output)
调用1}}。
在您的代码中Owner.findOne
被称为之前执行return reply(output)
的异步回调。此外,您不需要Owner.findOne
,因为您无法使用return
从这些回调中返回值,return
仅退出该处的函数。
return