Node.js 为什么我的express会话不能持久化,为什么我要为每个请求创建一个新会话(或多个会话)
我有一个使用express会话的基本node.js express应用程序Node.js 为什么我的express会话不能持久化,为什么我要为每个请求创建一个新会话(或多个会话),node.js,express,express-session,Node.js,Express,Express Session,我有一个使用express会话的基本node.js express应用程序 // see what requests are being sent and which ones contain cookies app.use((req, res, next) => { const { url } = req; const isCookieSent = req.headers.cookie; console.log({ url }); console.log({ isCook
// see what requests are being sent and which ones contain cookies
app.use((req, res, next) => {
const { url } = req;
const isCookieSent = req.headers.cookie;
console.log({ url });
console.log({ isCookieSent });
next();
});
请有人帮助解释为什么会话没有持久化,以及为什么为每个请求创建一个新会话
应用程序本身相当大,所以我在下面添加了一个重要设置的简化案例
const express = require('express');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);
// initialise express
const app = express();
// initialise db session store
const store = new MongoDBStore({
uri: MONGODB_URI,
collection: 'sessions',
// can also set expire here for auto cleanup by mongodb
});
app.use(session({
secret: 'secret password',
resave: false,
saveUninitialized: false,
httpOnly: false,
secure: app.get('env') === 'production',
store,
}));
...routes
在用户登录路由中,应用程序将请求用户设置为会话并保存会话。预计此
req,session.user
将在页面之间保持,但不会。在每个页面请求上,我可以看到正在创建一个新会话(有时是多个会话,每个文件请求一个会话)。更新
TL:DR强>
-robots.txt导致问题如果未处理,请将DEBUG env设置为express session以进行故障排除
在做了大量的头发拉扯之后,我找到了一个解决方案和一些有用的故障排除技巧
运行应用程序时,请将调试设置为express session来运行它
因此,对于像我这样的新手,请使用类似以下命令运行应用程序:
DEBUG=express-session node 'bin/www.js'
或
取决于你如何设置应用程序入口点
这样做将打印与会话相关的日志MSG,以便您可以排除cookie是否随每个请求一起发送的问题。错误消息将如下所示:
express-session fetching 0wgmO1264PsVvqeLqaIIXd6T0ink0zts +34s
express-session session found +49ms
要解决多个请求导致每页加载多个会话的问题,请在应用程序顶部添加一个中间件,然后再添加其他中间件。这将允许我们查看请求URL,并排除哪些请求可能会干扰我们的会话
// see what requests are being sent and which ones contain cookies
app.use((req, res, next) => {
const { url } = req;
const isCookieSent = req.headers.cookie;
console.log({ url });
console.log({ isCookieSent });
next();
});
通过这样做,我发现罪魁祸首是robots.txt文件,显然默认情况下唯一被忽略的路径是favicon.ico
因为这个robots.txt路径没有得到正确处理,也没有发送cookie,所以它会导致重复的请求,也会导致cookie无法持久
要解决此问题,您需要在访问会话中间件之前处理或忽略此请求
我使用这个中间件完成了这项工作,再一次达到了相当高的水平
app.get('/robots.txt', (req, res) => {
res.type('text/plain');
res.send('User-agent: *\nDisallow: /');
});
我是node.js的新手,所以如果有人有更多的知识,请随时提供额外的信息或更干净的方法来解决这个问题。希望这能为你们中的一些人节省很多麻烦 对调试express会话有很大帮助!这在另一方面帮助了我很多。谢谢