req.session内容试图访问另一条路线时会消失
我不能使用expressjs会话来了解我的代码有什么问题。
我在路由/login
上设置了req.session.is_logged = true
,然后按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
您可能不尊重同一起源策略 ,会话系统不支持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 }));