如何使用callback从主函数通过nodejs中的嵌套函数返回?

我正在尝试编写validation函数,validation我的请求标头。 如果所有标题都正确,则返回true;如果有错误,则返回false。 我对每个(几乎)请求都执行这个函数。 问题是,我不知道如何返回主函数的情况下,我使用callback和设置任何标志不起作用,由于一些问题与variables范围。 当我没有callback的时候,一切都很好,我只是用下划线来查询我的JSON。 现在我使用NeDB并绑定callback,我无法完成工作。 我试图使用一个全局的“res”variables,但问题是,当我将参数“cnt”的值(如果没有find标记为0,如果有一个标记为1)分配给“res”,那么“res “总是在”cnt“后面迭代1次:ie:

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的情况下使用true返回主函数,如果使用全局variables或使用其他方法,则在“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; } } 

你不能从里面执行asynchronous,非阻塞操作的函数返回一个有意义的值。 你需要做的是传递callback:

 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的callback函数的返回值。 您不能以同步方式使用它。 你可以遵守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) } } 

你可以使用callback结果。 注意:不要在asynchronous函数中使用return。 使用callback来传递值。 nodejs风格的callback函数有2个参数。 第一个是错误,第二个是结果。