【问题标题】:express-session: Why is redirect executed before my session info is set?express-session:为什么在我的会话信息设置之前执行重定向?
【发布时间】:2016-05-12 23:42:20
【问题描述】:

另一个“我刚刚开始学习 node.js/express,现在我卡住了”的人在这里。我试过到处寻找答案,但我走到了死胡同。这是我的第一个 Stackoverflow 问题,如果我做错了什么或不合常规,请告诉我。

我正在尝试创建一个 POST 请求,将用户对象保存到快速会话(在 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
                });
            }

        });
    }); 
});

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

出于某种原因,这些事情并没有按顺序发生。 GET 请求处理程序找不到 req.session.user。

我知道 node.js 是关于异步的,但是从我在网上找到的其他示例来看,这应该可以工作。我在这里错过了什么?

【问题讨论】:

    标签: node.js express session-cookies express-session


    【解决方案1】:

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

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

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

    注意:确保您使用 Bcrypt 或 pbkdf2 之类的内容对密码进行哈希处理

    【讨论】:

      猜你喜欢
      • 2023-01-23
      • 2019-01-12
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2019-09-23
      相关资源
      最近更新 更多