Node.js 如何使用回调通过nodejs中的嵌套函数从主函数返回?

Node.js 如何使用回调通过nodejs中的嵌套函数从主函数返回?,node.js,callback,Node.js,Callback,我正在尝试编写一个验证函数,用于验证我的请求头。如果所有标题均为ok,则返回true;如果出现错误,则返回false。我为每个(几乎)请求执行此函数。问题是,我不知道如何返回main函数,以防我使用回调,并且由于变量范围的一些问题,设置任何标志都不起作用。当我在没有回调的情况下工作时,一切都很好,我只是用下划线来查询我的JSON。现在,我使用NeDB,并绑定到回调,我无法完成工作。 我尝试使用一个全局“res”变量,但问题是,当我将参数“cnt”(如果找不到令牌,则为0;如果有令牌,则为1)的值

我正在尝试编写一个验证函数,用于验证我的请求头。如果所有标题均为ok,则返回true;如果出现错误,则返回false。我为每个(几乎)请求执行此函数。问题是,我不知道如何返回main函数,以防我使用回调,并且由于变量范围的一些问题,设置任何标志都不起作用。当我在没有回调的情况下工作时,一切都很好,我只是用下划线来查询我的JSON。现在,我使用NeDB,并绑定到回调,我无法完成工作。 我尝试使用一个全局“res”变量,但问题是,当我将参数“cnt”(如果找不到令牌,则为0;如果有令牌,则为1)的值分配给“res”时,“res”的值始终在“cnt”之后1次迭代:即:

我所要做的就是在全局变量的帮助下或使用其他方法返回main函数,如果“cnt”=1,则返回true;如果“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);
});

如果要使用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)
        }
}