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

标签 node.js callback

我正在尝试编写一个验证函数来验证我的请求 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/

相关文章:

node.js - 数据库客户端抽象

java - Android 选项菜单不起作用?

node.js - 如何在 Sequelize ORM 中插入 PostGIS GEOMETRY 点?

javascript - Node + Express 开发流程

node.js - 迁移 Angular Universal firebase 后云函数抛出错误

iOS Swift 网络层

javascript - 回调函数不等待 jQuery fadeOut() 完成?

javascript - 等待 Nightmare js中的javascript函数

ruby-on-rails - 为 Rails 使用多个回调(:after_commit)?

c++ - 将成员函数从 C++ CLI 传递到 native C 回调