Node.js 如何使用回调通过nodejs中的嵌套函数从主函数返回?
我正在尝试编写一个验证函数,用于验证我的请求头。如果所有标题均为ok,则返回true;如果出现错误,则返回false。我为每个(几乎)请求执行此函数。问题是,我不知道如何返回main函数,以防我使用回调,并且由于变量范围的一些问题,设置任何标志都不起作用。当我在没有回调的情况下工作时,一切都很好,我只是用下划线来查询我的JSON。现在,我使用NeDB,并绑定到回调,我无法完成工作。 我尝试使用一个全局“res”变量,但问题是,当我将参数“cnt”(如果找不到令牌,则为0;如果有令牌,则为1)的值分配给“res”时,“res”的值始终在“cnt”之后1次迭代:即: 我所要做的就是在全局变量的帮助下或使用其他方法返回main函数,如果“cnt”=1,则返回true;如果“cnt”=0,则返回falseNode.js 如何使用回调通过nodejs中的嵌套函数从主函数返回?,node.js,callback,Node.js,Callback,我正在尝试编写一个验证函数,用于验证我的请求头。如果所有标题均为ok,则返回true;如果出现错误,则返回false。我为每个(几乎)请求执行此函数。问题是,我不知道如何返回main函数,以防我使用回调,并且由于变量范围的一些问题,设置任何标志都不起作用。当我在没有回调的情况下工作时,一切都很好,我只是用下划线来查询我的JSON。现在,我使用NeDB,并绑定到回调,我无法完成工作。 我尝试使用一个全局“res”变量,但问题是,当我将参数“cnt”(如果找不到令牌,则为0;如果有令牌,则为1)的值
function validateHeaders(request) {
if (request.headers.username && request.headers.deviceid) {
if (...) {
function getResult(callback) {
db.tokens.count({...
}, function (err, cnt) {
if (err) {
console.log(err);
} else {
callback(cnt);
}
});
}
getResult(function (cnt) {
res = cnt;
console.log({
count: cnt
});
});
console.log({
result: res
});
} else {
return false;
}
} else {
return false;
}
}
您不能从内部执行异步、非阻塞操作的函数返回这样有意义的值。您需要做的是传入回调:
function validateHeaders(request, cb) {
if (request.headers.username && request.headers.deviceid) {
if (...) {
db.tokens.count({
// ...
}, function (err, cnt) {
if (err) {
cb(err);
} else {
cb(null, cnt === 1);
}
});
return;
}
}
cb(null, false);
}
然后像这样使用它:
validateHeaders(req, function(err, success) {
if (err) throw err; // TODO: improve error handling
console.log(success);
});
如果要使用nodejs的回调函数的返回值。您不能在同步样式中使用它。您可以遵守nodejs的约定
function validateHeaders(request, cb) {
if (request.headers.username && request.headers.deviceid) {
if (...) {
function getResult(callback) {
db.tokens.count({...
}, function (err, cnt) {
callback(err, cnt);
});
}
getResult(function (err, cnt) {
if (err) {
cb(err);
} else {
if (cnt === 0)
cb(null, false);
else
cb(null, true);
}
});
} else {
cb(null, false)
}
}
您可以使用回调结果。
注意:不要在异步函数中使用return。使用callback传递值。
nodejs风格的回调函数有2个参数。第一个是err,第二个是result。由于函数中有一个异步函数,在完成之前不应返回,因此需要通过添加回调函数使主函数
validateHeaders
也异步。“异步”表示将函数输入事件队列,以便在当前同步函数完成时运行(最早)。因此,JavaScript引擎严格保证validateHeaders
在任何异步操作开始之前(例如对db.tokens.count
的回调)将完全运行并返回一个值。这基本上是重复的——只需将“Ajax成功函数”替换为db.tokens.count
。其他类似的问题也很简单,非常感谢您的输入!
function validateHeaders(request, cb) {
if (request.headers.username && request.headers.deviceid) {
if (...) {
function getResult(callback) {
db.tokens.count({...
}, function (err, cnt) {
callback(err, cnt);
});
}
getResult(function (err, cnt) {
if (err) {
cb(err);
} else {
if (cnt === 0)
cb(null, false);
else
cb(null, true);
}
});
} else {
cb(null, false)
}
}