【问题标题】:How to return from main function via a nested function in nodejs using callbacks?如何使用回调通过nodejs中的嵌套函数从主函数返回?
【发布时间】:2014-10-01 15:02:17
【问题描述】:

我正在尝试编写一个验证函数来验证我的请求标头。如果所有标题都正常,则返回 true,如果有问题,则返回 false。我为每个(几乎)请求执行此功能。问题是,由于变量范围的一些问题,我不知道如何返回主函数,以防我使用回调并且设置任何标志都不起作用。当我在没有回调的情况下工作时一切都很好,我只是使用下划线来查询我的 JSON。现在我使用 NeDB 并绑定到回调,我无法完成工作。 我尝试使用全局“res”变量,但问题是,当我将参数“cnt”的值(如果找不到令牌,则为 0,如果有令牌,则为 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 时返回主函数,如果“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;
    }
}

【问题讨论】:

标签: node.js callback


【解决方案1】:

您不能从内部执行异步、非阻塞操作的函数返回有意义的值。你需要做的是传入一个回调:

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);
});

【讨论】:

    【解决方案2】:

    如果你想使用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。使用回调来传输值。 nodejs 风格的回调函数有 2 个参数。第一个是err,第二个是result。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多