Nodejs session-mongoose 用了这个存储session 为什么无法写值

Nodejs session-mongoose 用了这个存储session 为什么无法写值

session-mongoose 用了这个存储session 为什么 req.session.user = user;
写不进去值呢

5 回复

Node.js session-mongoose 用了这个存储session 为什么无法写值

在使用 session-mongoose 存储 Node.js 的 session 数据时,可能会遇到一些问题导致无法正确写入 session 值。以下是一个可能的解决方案以及相关的示例代码。

问题分析

session-mongoose 是一个用于将 session 数据存储到 MongoDB 的中间件。如果你发现无法通过 req.session.user = user; 来写入 session 值,可能是由于以下几个原因:

  1. 会话未初始化:确保在写入 session 值之前,会话已经被正确初始化。
  2. 中间件顺序:确保 express-sessionsession-mongoose 中间件的顺序正确。
  3. 错误处理:检查是否有任何错误发生,例如数据库连接问题等。

示例代码

下面是一个完整的示例代码,展示了如何配置和使用 session-mongoose 存储 session 数据,并成功写入 session 值。

const express = require('express');
const session = require('express-session');
const connectMongo = require('connect-mongo');

const app = express();

// 配置 MongoDB 连接
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 使用 connect-mongo 创建 session 存储
const MongoStore = connectMongo.create({ mongoUrl: 'mongodb://localhost:27017/mydatabase' });

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

app.get('/', (req, res) => {
    // 检查 session 是否存在
    if (!req.session.user) {
        req.session.user = { name: 'John Doe' };
    }

    // 将 session 数据写入响应
    res.send(req.session.user);
});

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

解释

  1. 安装依赖

    • express: Web 应用框架。
    • express-session: 用于管理 session。
    • connect-mongo: 将 session 存储到 MongoDB。
    • mongoose: MongoDB ODM。
  2. 配置 MongoDB

    • 使用 mongoose 连接到本地 MongoDB 数据库。
  3. 配置 session

    • 使用 express-sessionconnect-mongo 创建 session 存储。
    • 设置 secretresavesaveUninitialized 参数。
  4. 设置路由

    • / 路由中,检查 req.session.user 是否已存在。如果不存在,则将其设置为 { name: 'John Doe' }
    • 返回当前的 req.session.user
  5. 启动服务器

    • 监听端口 3000 并启动服务器。

通过上述步骤,你应该能够成功地使用 session-mongoose 存储 session 数据并写入 session 值。


用session-mongoose存储session 在app的中间件里要使用 app.use(express.cookieParser());

使用了,还是不行

var store = new SessionStore({ url: “mongodb://192.168.62.213/session”, interval: 120000 });

app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser());

app.use(express.session({ secret : ‘shiqiliang’, store: store, cookie: { maxAge: 900000 } }));

这么配置好以后 如果要存储一个值到session的话怎么操作,req.session.user = user;是这样就自动存到mongo的数据库里面了吗?

在使用 session-mongoose 存储 Node.js 应用中的会话时,如果发现无法向 req.session 写入值,通常是因为以下几个常见原因:

  1. 未正确配置中间件:确保在应用中正确配置了 express-sessionsession-mongoose 中间件。
  2. 会话存储问题:确认会话已经成功保存到 MongoDB。
  3. 作用域或时机问题:确保在会话存储操作完成后设置 req.session 的值。

下面是一个示例代码,展示了如何正确配置并使用 session-mongoose

安装依赖

首先安装必要的依赖:

npm install express mongoose connect-mongo session-mongoose

示例代码

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo');
const sessionMongoose = require('session-mongoose');

const app = express();

// 连接 MongoDB
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/myapp', { useNewUrlParser: true, useUnifiedTopology: true });

// 配置 session
app.use(session({
    secret: 'your-secret-key',
    resave: false,
    saveUninitialized: false,
    store: MongoStore.create({
        client: mongoose.connection.getClient(),
        collection: 'sessions'
    }),
}));

app.use(sessionMongoose(session));

app.get('/', (req, res) => {
    // 设置会话值
    req.session.user = { id: 1, name: 'John Doe' };
    
    // 同步会话数据
    req.session.save((err) => {
        if (err) throw err;
        console.log('Session saved!');
        res.send('Session value set successfully.');
    });
});

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

关键点解释

  • 中间件顺序:确保先配置 express-session,然后再配置 session-mongoose
  • 会话同步:在设置完 req.session 的值后,需要调用 req.session.save() 来确保会话数据被保存到 MongoDB。
  • 错误处理:在 req.session.save() 回调中添加错误处理逻辑,确保不会遗漏潜在的错误。

通过上述配置,你应该能够正确地向 req.session 写入值,并且这些值会被持久化到 MongoDB 中。

回到顶部