我正在尝试编写一个验证函数来验证我的请求 header 。如果所有 header 都正常,则返回 true;如果出现问题,则返回 false。我为每个(几乎)请求执行此功能。问题是,如果我使用回调并且设置任何标志不起作用,我不知道如何返回主函数,因为变量范围存在一些问题。当我在没有回调的情况下工作时一切都很好,我只是使用下划线来查询我的 JSON。现在我使用 NeDB 并绑定(bind)到回调我无法完成工作。 我尝试使用全局“res”变量,但问题是,当我将参数“cnt”的值(如果未找到 token 则为 0,如果有 token 则为 1)分配给“res”,则“res”的值"总是在 "cnt"之后迭代 1 次:即:
request1 (valid): cnt = 1; res = undefined;
request2 (valid): cnt = 1; res = 1;
request3 (invalid): cnt = 0; res = 1;
request4 (valid): cnt = 1; res = 0;
我想做的就是在“cnt”= 1 时返回 main 函数,在“cnt”= 0 时返回 false,无论是借助全局变量还是使用其他方法。
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);
});
关于node.js - 如何使用回调通过nodejs中的嵌套函数从主函数返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26144406/