简体   繁体   English

会话不存储在Express for Node.js中

[英]Session not storing in Express for Node.js

I have the following route that basically acts on the post from a login form. 我有以下路线,基本上从登录表单作用于帖子。 The problem is that when the login is a success (member is found and the passwords match), the member._id is not stored in the session. 问题是当登录成功(找到成员并且密码匹配)时,member._id不会存储在会话中。

My route: 我的路线:

app.post('/signin', function(req, res) {
    Member.findOne({username: req.body.username}, function(error, member) {
        var matchPassword = crypto.createHmac('sha1', member.salt).update(req.body.password).digest('hex');
        if(member.password == matchPassword) {
            req.session.member_id = member._id;
            res.redirect('/' + member.username);
        }
    });
    res.redirect('/');
});

I get the following error in console when this route is fired: 触发此路由时,我在控制台中收到以下错误:

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: Can't set headers after they are sent.
    at ServerResponse.<anonymous> (http.js:527:11)
    at ServerResponse.setHeader (/Users/admin/Node Projects/sandboxProject/node_modules/express/node_modules/connect/lib/patch.js:62:20)
    at ServerResponse.header (/Users/admin/Node Projects/sandboxProject/node_modules/express/lib/response.js:280:8)
    at ServerResponse.redirect (/Users/admin/Node Projects/sandboxProject/node_modules/express/lib/response.js:413:10)
    at Promise.<anonymous> (/Users/admin/Node Projects/sandboxProject/app.js:109:8)
    at Promise.<anonymous> (/Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/promise.js:120:8)
    at Promise.<anonymous> (events.js:64:17)
    at Promise.emit (/Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/promise.js:59:38)
    at Promise.complete (/Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/promise.js:70:20)
    at /Users/admin/Node Projects/sandboxProject/node_modules/mongoose/lib/query.js:1087:15

It would seem that it didn't like the "res.redirect('/' + member.username);" 它似乎不喜欢“res.redirect('/'+ member.username);” after the "req.session.member_id = member._id;". 在“req.session.member_id = member._id;”之后。 Is this because of the asynchronous nature of the Mongoose findOne callback that it's in? 这是因为它所在的Mongoose findOne回调的异步性质吗? I've tried removing the res.redirect from the callback but the session data is not stored and when I leave it in there, I get the "headers already sent" error. 我已经尝试从回调中删除res.redirect但是会话数据没有存储,当我把它留在那里时,我得到“已经发送的头文件”错误。

My configuration: 我的配置:

app.configure(function(){
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.cookieParser());
    app.use(express.session({ secret: "blahblah" }));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

I had a similar problem. 我遇到了类似的问题。 Although my problem was that when I deleted something from session, eg delete req.session.user , it would still be there after reloads and node app restarts. 虽然我的问题是,当我从会话中删除某些内容时,例如delete req.session.user ,它会在重新加载和节点应用程序重新启动后仍然存在。 It would only be gone after req.session.destroy() . 它只会在req.session.destroy()之后req.session.destroy()

I looked at Node's session middleware docs and found that they have a Session#save() method. 我查看了Node的会话中间件文档 ,发现他们有一个Session#save()方法。 So I did req.session.save() after session object manipulations and it did fix my problem. 所以我在会话对象操作之后做了req.session.save() ,它确实解决了我的问题。 Try it and see if it fixes yours. 试一试,看看它是否能解决你的问题。

The problem is that Member.findOne is asynchronous. 问题是Member.findOne是异步的。 By the time its callback executes, the res.redirect('/') has already executed, which sets the appropriate HTTP response headers. 当其回调执行时, res.redirect('/')已经执行,它设置了适当的HTTP响应头。 You can't send headers twice by HTTP rules, hence the error Can't set headers after they are sent. 您不能通过HTTP规则两次发送标头,因此错误Can't set headers after they are sent.

You probably want to move the redirect('/') into an else block of your password matching. 您可能希望将redirect('/')到密码匹配的else块中。

I had a similar problem. 我遇到了类似的问题。 but my problem is at the time: 但我当时的问题是:

request.session.user = user; request.session.user = user;

I discovered through debug, When commenting out this line,This error does not occur: 我通过调试发现,当注释掉这一行时,不会发生此错误:

// request.session.user = user; // request.session.user = user;

this is my question: express 4.x session-mongoose Can't set headers after they are sent(Been resolved) 这是我的问题: 快递4.x session-mongoose发送后无法设置标题(已解决)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM