nodejs clientCertificateAuth始终返回false

时间:2014-02-25 08:05:38

标签: node.js asynchronous mongoose

我使用以下节点模块对我的路由上的客户端请求进行身份验证:https://github.com/tgies/client-certificate-auth

var checkAccess = function(cert) {
    return User.findOne({ 'subject': cert.subject.ST }, function (err, user) {
        if (!err) {
            if (user.active === true) {
                return true;
            }
            else {
                return false;
            }
        }
        else {
            return console.log(err);
        }
    });
};

app.post('/test', clientCertificateAuth(checkAccess), function(req, res) {
    //...
});

问题是,checkAccess总是返回:false 我认为这是因为mongoose查询是异步的。

有没有办法等待数据库结果?

谢谢

2 个答案:

答案 0 :(得分:1)

此处为client-certificate-auth模块的作者。

您的主要问题是return User.findOne(...) - 您的函数正在此处返回,而不是等待异步调用。

3月发布的0.3版本在授权检查中处理异步更好。只需提供一个带有两个参数的函数,即checkAccess(cert, done)clientCertificateAuth会向您传递回调函数,然后您致电done(true)表示成功,或done(false)表示失败:

var checkAccess = function(cert, done) {
    User.findOne({ 'subject': cert.subject.ST }, function (err, user) {
        if (!err && user.active) {
            done(true);
        }
        else {
            done(false);
        }
    });
};

答案 1 :(得分:0)

将您的功能更改为此;

var checkAccess = function(req, res, next) {
        User.findOne({ 'subject': cert.subject.ST }, function (err, user) {
            if (!err) {
                if (user.active === true) {
                    console.log("User active found");
                    req.result = true;
                    next();
                }
                else {
                    console.log("User active not found");
                    req.result = false;
                    next();
                }
            }
            else {
                console.log("Error occured while fetching user");
                req.result = false;
                next();
            }
        });
    };

在您的控制器中;

app.post('/test', checkAccess, function(req, res, next) {
    if (clientCertificateAuth(req.result) != true) {
        console.log("Invalid cert due to active user not found");
        next("Invalid certificate");
    }
});

我上面做的是;只需在控制器请求中调用一个函数,我就根据db结果更新了req.result。我在clientCertificateAuth

的控制器中使用了该结果

您的return语句响应没有,因为mongoose查询可能尚未完成