2

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

我正在尝试创建一个 POST 请求,将用户对象保存到快速会话(在 MongoDB 上),并将您重定向到处理会话信息的 URL。

问题是,用户在设置标头之前被重定向,我得到以下信息: 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 回答