1

セッション変数が未定義に設定されているという同様の問題を検索して見つけましたが、見つけた答えはどれも当てはまりませんでした。

ルーターファイルにこの機能があります:

exports.loginHandler = function(req, res){
    username = req.body.username;
    password = req.body.password;
    readAccount(username, function(acct){
        if (acct.password = password){
            req.session.username = username;
            console.log(username+' logged in'+' pass: '+acct.password);
        };
    });
    res.redirect('/');
};

console.log は正常に実行され、username と acct.password の両方に適切な値が設定されています。ただし、 req.session.username は undefined に設定されてしまいます。

readAccount 関数は次のとおりです。

readAccount = function(user, callback){
    AM.login(user, function(acct){
        callback(acct);
    });
};

AM.login は次のとおりです。

exports.login = function(user, callback){
    accounts.findOne({username: user}, function(err, result){
    if (err) throw err;
    callback(result);
    })
}

このタイプのエラーは珍しくないように見えるので、セッション変数は特定の条件下では設定できないと思います。

4

2 に答える 2

5

問題は、プロパティを設定する前にリダイレクトしていることです。これにより、応答が終了し、セッションが保存されsession.usernameます。これはreadAccount、によってaccounts.findOne、が非同期であり、res.redirect()が呼び出される前に終了しないためです。

res.redirect()readAccountコールバックに移動することで、実行順序を確認できます。

exports.loginHandler = function(req, res){
    username = req.body.username;
    password = req.body.password;

    readAccount(username, function(acct){
        if (acct.password = password){
            req.session.username = username;
            console.log(username+' logged in'+' pass: '+acct.password);
        };

        res.redirect('/');
    });
};

throwまた、非同期操作でのエラーに注意してください。コールバックの呼び出しスタックは開始関数(例readAccount)とは異なるため、catchエラーが発生しにくくなります。これが、Nodeの多くのAPIが代わりに引数としてエラーを渡す理由です。

于 2013-01-02T21:37:31.190 に答える