0

Node.jsの処理順序を理解するのに問題があります。私の問題:次のプロパティを使用して、セッションをCookieに保存する小さなアプリケーションをコーディングしました。

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

randomHash varは、ユーザーがログインするたびに生成されてdbに保存されるランダムな文字列です。セッションを持つユーザーがプライベートページを表示したい場合、メソッド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値はの値ではありません。コールバックは、終了するまで実行されません。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 に答える