req.session内容试图访问另一条路线时会消失

我不能使用expressjs会话来了解我的代码有什么问题。

我在路由/login上设置了req.session.is_logged = true ,然后按F5调用路由/sessionreq.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

您可能不尊重同一起源策略 ,会话系统不支持CORS。

你的代码没有错,但是如果你访问了mydomain.com的URL并且到达了你的节点服务器mydomain.com:3000那它就无法工作。

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

问题是你没有发送你的login路线的回应,所以客户端不知道设置一个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 })})); 

你正在设置req.session.is_logged = false在/login路线,所以怎么会是真的..

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

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