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

时间:2014-10-01 15:02:18

标签: node.js callback

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

request1 (valid): cnt = 1; res = undefined;
request2 (valid): cnt = 1; res = 1;
request3 (invalid): cnt = 0; res = 1;
request4 (valid): cnt = 1; res = 0;

我想要做的就是返回main函数,如果" cnt" = 1,如果" cnt"则为假= 0,可以借助全局变量或使用其他方法。

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

2 个答案:

答案 0 :(得分: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);
});

答案 1 :(得分:0)

如果要使用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个参数。第一个是错误的,第二个是结果。