express-session:为什么在设置会话信息之前执行重定向?

Nic*_*tad 1 session-cookies node.js express express-session

还有一个"我刚刚开始学习node.js/express,现在我卡住了"这里的人.我试着到处寻找答案,但我已经走到了尽头.这是我的第一个Stackoverflow问题,所以请告诉我,如果我做错了什么或非常规的.

我正在尝试创建一个POST请求,将User-object保存到express-session(在MongoDB上),并将您重定向到处理会话信息的URL.

问题是,在设置标头之前重定向用户,并给出以下内容: Error: Can't set headers after they are sent.

这是我的代码.我知道这很多..我很抱歉.

router.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
                });
            }

        });
    }); 
});
Run Code Online (Sandbox Code Playgroud)

请注意'req.session.user = userObj'部分.在这里,我试图在会话中将'user'设置为从MongoDB检索的用户对象.在下一行中,我将用户重定向回"/"的GET请求处理程序,该处理程序根据会话信息处理用户.

出于某种原因,这些都不是按顺序发生的.GET请求处理程序找不到req.session.user.

我知道node.js是关于异步的,但是从我在网上发现的其他例子来看,这应该是有效的.我在这里错过了什么?

Ash*_*y B 7

保存会话后,您可以将重定向放入回调中,例如:

...

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

...
Run Code Online (Sandbox Code Playgroud)

希望这将确保在保存会话后仅重定向用户.

注意:确保使用Bcrypt或pbkdf2之类的哈希密码.