2

さらに別の「node.js/expressの学習を始めたばかりで、今は行き詰まっている」人がここにいます。私はどこでも答えを探してみましたが、行き止まりに達しました。これは私の最初の Stackoverflow の質問です。間違ったことや型破りなことをしたかどうか教えてください。

ユーザー オブジェクトを高速セッション (MongoDB 上) に保存し、セッション情報を処理する URL にリダイレクトする POST 要求を作成しようとしています。

問題は、ヘッダーが設定される前にユーザーがリダイレクトされ、次のように表示されることです。 Error: Can't set headers after they are sent.

これが私のコードです。私はそれがたくさんあることを知っています..申し訳ありません。

ルーター.post()

// Handler for POST requests from root page (/)
router.post('/', function(req, res) {
    console.log("Router: A POST request for: \"/\" has been called!");

    var username = req.body.username;
    var password = req.body.password;

    // Connect to database
    mongoose.connect(dbAddress);
    var db = mongoose.connection;

    // Report if error in connection
    db.on('error', console.error.bind(console, 'Database: Connection error..'));

    // Callback function on 'open'
    db.once('open', function() {
        console.log("Database: Connection successful!");
        console.log("Database: User supplied username: " + username);
        console.log("Database: User supplied password: " + password);

        // Find User object with a userId of req's username
        User.findOne({ 'userId' : username.toUpperCase() }, function(err, userObj) {

            if (err)
                return console.err(err);

            // Disconnect when done retrieving user object
            mongoose.disconnect();

            if ( userObj ) {
                console.log("Database: Returned password from MongoDB:");
                console.log(userObj.password);

                var db_password = userObj.password;

                if (password === db_password) {
                    console.log("Database: User Authenticated");

                    // Set 'req.session.user' as cookie
                    req.session.user = userObj;

                    // Redirect to homepage, with new cookie set
                    res.redirect('/');

                } else { // If passwords don't match
                    res.render('index', {
                        showError: true
                    });
                }
            } else { // If userObj is null
                res.render('index', {
                    showError: true
                });
            }

        });
    }); 
});

「req.session.user = userObj」の部分に注意してください。ここでは、セッションの「ユーザー」を MongoDB から取得したユーザー オブジェクトに設定しようとしています。次の行では、セッション情報に基づいてユーザーを処理する '/' の GET 要求ハンドラーにユーザーをリダイレクトしています。

何らかの理由で、これらは順番に発生していません。GET リクエスト ハンドラが req.session.user を見つけられません。

node.js はすべて非同期であることを理解していますが、オンラインで見つけた他の例から、これは機能するはずです。ここで何が欠けていますか?

4

1 に答える 1

9

セッションが保存された後、コールバック内にリダイレクトを配置できます。

...

// Set 'req.session.user' as cookie
req.session.user = userObj;
req.session.save(function(err) {
  // session saved
  res.redirect('/')
})

...

これにより、セッションが保存された後にのみユーザーがリダイレクトされるようになることを願っています。

注: Bcryptや pbkdf2などでパスワードをハッシュ化してください

于 2016-02-03T23:15:59.413 に答える