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

我有一个使用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({ 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会话有很大帮助!这在另一方面帮助了我很多。谢谢