Nodejs mongoStore, session丢失问题。session里的内容读不出来

Nodejs mongoStore, session丢失问题。session里的内容读不出来

请教:mongoStore, session丢失。session里的内容读不出来。每请求一次,collection增加一条

7 回复

Node.js MongoDB Session 丢失问题

问题描述

在使用 express-sessionconnect-mongo 模块时,发现每次请求都会导致 MongoDB 中的 session collection 增加一条记录,并且无法正确读取 session 中的内容。

解决方案

  1. 确保依赖安装正确 首先,确保已经安装了必要的依赖包:

    npm install express express-session connect-mongo mongoose
    
  2. 配置正确的中间件 确保在应用中正确配置了 express-sessionconnect-mongo 中间件。以下是一个示例配置:

    const express = require('express');
    const session = require('express-session');
    const MongoStore = require('connect-mongo')(session);
    const mongoose = require('mongoose');
    
    const app = express();
    
    // 连接 MongoDB
    mongoose.connect('mongodb://localhost:27017/mydatabase', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    
    // 配置 session 中间件
    app.use(session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: false,
      store: new MongoStore({ mongooseConnection: mongoose.connection }),
      cookie: { maxAge: 60000 } // 设置 session 的过期时间(毫秒)
    }));
    
    app.get('/', (req, res) => {
      if (!req.session.views) {
        req.session.views = 0;
      }
      req.session.views++;
      res.send(`你已经访问了 ${req.session.views} 次`);
    });
    
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  3. 检查 MongoDB 集合 确认 MongoDB 中的 sessions 集合是否正确存储了 session 数据。可以通过 MongoDB 客户端查看集合中的文档内容。

  4. 清理旧的 session 记录 如果发现有大量未使用的 session 记录,可以定期清理这些记录。例如,可以在定时任务中执行清理操作:

    const clearExpiredSessions = async () => {
      await MongoStore.clear();
      console.log('Expired sessions cleared');
    };
    
    // 每天凌晨 2 点执行一次清理操作
    setInterval(clearExpiredSessions, 24 * 60 * 60 * 1000); // 每天一次
    

通过以上步骤,应该能够解决 session 丢失的问题,并确保每次请求都能正确读取到 session 中的内容。如果问题仍然存在,请检查是否有其他中间件或配置影响了 session 的行为。


cookie的sessionId没有保存?

你用了app.use(express.cookieParser());了吗

app.use express.bodyParser() app.use express.cookieParser 'xxxxxxxxx’ app.use express.session store: new MongoStore db: 'dbxxxx’ maxAge: 365 * 24 * 60 * 60 * 1000 这样有什么问题吗

之前的session中有user信息,再去请求一次,session中只有cookie信息,新生成的

贴代码别忘记开头结尾分别一行 ``` 来标记代码

针对你的问题,mongoStoresession 丢失问题通常与会话存储配置不正确或中间件设置不正确有关。以下是一个基本示例,展示如何正确使用 connect-mongo 库来配置 mongoStore 并解决 session 丢失的问题。

示例代码

首先确保安装了所需的依赖库:

npm install express connect-mongo mongoose cookie-parser

然后在你的 Node.js 应用程序中进行如下配置:

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const mongoose = require('mongoose');
const cookieParser = require('cookie-parser');

const app = express();

// 配置 Mongoose 连接 MongoDB
mongoose.connect('mongodb://localhost:27017/testdb', {
    useNewUrlParser: true,
    useUnifiedTopology: true,
});

app.use(cookieParser());
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection }),
}));

app.get('/', (req, res) => {
    // 将数据存储到 session 中
    req.session.myData = 'Hello World';

    // 从 session 中读取数据
    const myData = req.session.myData;

    res.send(`Session data: ${myData}`);
});

app.listen(3000, () => console.log('Server is running on port 3000'));

解释

  • Mongoose 和 Cookie Parser: 这些是连接 MongoDB 和解析 cookie 所需的库。
  • Session 配置: 使用 express-sessionconnect-mongo 库来配置 session 存储。
  • MongoStore: 使用 MongoStoresession 数据存储在 MongoDB 中。
  • 路由: 在根路径上设置一个简单的路由,用于演示如何将数据存储到 session 并从 session 读取数据。

通过上述配置,你应该能够解决 session 丢失的问题,并能正常读取 session 中的内容。如果问题仍然存在,请检查 MongoDB 是否已成功连接,以及是否设置了正确的 secret 键。

回到顶部