当尝试在另一条路线上访问时,req.session内容消失

时间:2012-12-30 10:39:58

标签: node.js session express

我无法使用expressjs会话了解我的代码有什么问题。

我在路由req.session.is_logged = true上设置/login,然后按F5调用路由/session,其中req.session.is_logged的值为false。

这是一些代码

var express = require("express");
var app = express();

app.configure(function(){
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({secret: 'test', store: express.session.MemoryStore({
        reapInterval: 60000 * 10
    })}));
});

app.get('/session', function(req, res){
        if (req.session.is_logged){
            console.log('|-->Session recognized');
            res.status(200);
            res.send({ response: "OK" });
        }else{
            console.log('|-->Any session recognized');
            res.status(403);
            res.send({ response: "KO" })
        };
});

app.get('/login', function(req, res){
    req.session.is_logged = true;
    res.status(200);
    res.send({ response: "OK" });       
});

app.listen(3000);

我看到了一些类似的方法,它似乎有效...感谢您的帮助!

Express v3.0.5

3 个答案:

答案 0 :(得分:1)

您可能不尊重相同的origin policy,会话系统不支持CORS。

您的代码没有错,但是如果您访问网址mydomain.com并通过mydomain.com:3000访问您的节点服务器,则无法运行。

有很多方法可以使它工作(Apache代理反向,NGINX ......),做一些研究并采取最适合你的情况。

答案 1 :(得分:0)

你在/ login route上设置req.session.is_logged = false所以它怎么可能是真的..

使用内存存储进行会话的更好方法是

var MemoryStore = express.session.MemoryStore
,store = new MemoryStore();
app.use(express.session({ secret: 'something', store: store }));

答案 2 :(得分:0)

问题是您没有使用您的登录路由发送响应,因此客户端不知道设置cookie。解决方法是简单地发送任何响应:

app.get('/login', function(req, res){
    req.session.is_logged = true;            
    res.send('Ok!'); /* Now the 'Set-Cookie' HTTP header will be sent to the client. */
});

并确保您正确引用MemoryStore对象作为express.session的属性,因为它不是全局对象:

app.use(express.session({secret: 'test', store: express.session.MemoryStore({
    reapInterval: 60000 * 10
})}));