我有一个使用express-session的基本的node.js express应用。
请帮助某人,为什么会话不持久以及为什么为每个请求创建一个新会话。
该应用程序本身很大,因此我在下面添加了一些重要设置的精简版。
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
将在页面之间保留,但事实并非如此。在每个页面请求上,我可以看到正在创建一个新会话(或有时是多个会话,每个文件请求1个)。
UPDATE
在拉了很多头发之后,我找到了解决方案和一些有用的故障排除提示。
[在运行您的应用程序时,将其调试设置为express-session。因此对于像我这样的新手,请使用类似于以下命令运行您的应用程序:
DEBUG=express-session node 'bin/www.js'
或
DEBUG=express-session node app.js
取决于您如何设置应用程序入口点。
这样做会从会话中间件打印错误消息,因此您可以对是否实际上随每个请求发送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的新手,所以任何有更多知识的人都请提供更多信息或更干净的方法来解决此问题。希望这可以为您节省很多麻烦!