为什么我的快速会话不持续,为什么我要为每个请求创建一个新的会话(或多个会话)
我有一个使用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
TL:DR;-robots.txt导致问题,如果不解决,请将DEBUG env设置为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的新手,因此,如果有更多知识的人可以随意加入其他信息或采用更干净的方法来解决此问题。希望这可以为您节省很多麻烦!
为什么我的快速会话不持续,为什么我要为每个请求创建一个新的会话(或多个会话)
我有一个使用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
TL:DR;-robots.txt导致问题,如果不解决,请将DEBUG env设置为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的新手,因此,如果有更多知识的人可以随意加入其他信息或采用更干净的方法来解决此问题。希望这可以为您节省很多麻烦!