0

我在理解 Node.js 中的处理顺序时遇到问题。我的问题:我编写了一个小应用程序,它将会话保存在具有以下属性的 cookie 中:

session.email = email;
session.randomHash = randomHash;

randomHash var 是一个随机字符串,每次用户登录时都会生成并保存到数据库中。如果有会话的用户现在想要查看私有页面,则调用 checkSession() 方法:

exports.checkSession = function(req, res) {
    if(req.session) {
        var User = mongoose.model("User", userSchema);
        User.count({email: req.session.email, randomHash: req.session.randomHash}, function(err, count) {
            if(count === 0) {
                return false;
            }
            if(count === 1) {
                return true;
            }
        });
    }
    else {
        return false;
    }
};

该方法将cookie的randomHash与Db的randomHash值进行比较。此方法在路由中调用:

exports.init = function(req, res) {
    if(hashing.checkSession(req, res)) {
        res.render("controlpanel", {title: "Controlpanel", email: req.session.email});
    }
    else {
        res.send("Sorry but you are not logged in. Go to /login");
    }   
};

现在肯定有问题。由于节点非阻塞样式,该方法被调用但在执行 if 语句之前没有完成。我能做些什么呢?

4

1 回答 1

1

回调中的return值不是. 回调在after完成之前不会运行。User.countreturncheckSessionUser.count checkSession

将回调传递给checkSession并调用它User.count

exports.checkSession = function(req, res, callback) {
    if(req.session) {
        var User = mongoose.model("User", userSchema);
        User.count({email: req.session.email, randomHash: req.session.randomHash}, function(err, count) {
            if(count === 0) {
                callback(false);
            }
            if(count === 1) {
                callback(true);
            }
        });
    }
    else {
        callback(false);
    }
};

并称它为:

exports.init = function(req, res) {
    hashing.checkSession(req, res, function(result) {
        if(result) {
            res.render("controlpanel", {title: "Controlpanel", email: req.session.email});
        }
        else {
            res.send("Sorry but you are not logged in. Go to /login");
        }
    });
};
于 2013-01-28T14:46:04.027 回答