Nodejs的session如何做到多进程共享。求思路

Nodejs的session如何做到多进程共享。求思路

对于启动PM2总和起单进程。开多个就会session丢失。求解决办法、之前有人和我说过用mongdb去存储。但不知道如何实现。求解答 最好能有例子。就知道cnodejs的社区人最热心。先谢谢大家!

: )

4 回复

要解决Node.js应用在使用PM2启动多进程时session丢失的问题,可以利用一个共享的存储来保存session数据。其中一种常见的方式是使用MongoDB作为session存储。下面是一个简单的示例,展示如何使用express-session结合connect-mongodb-session来实现这一目标。

安装依赖

首先,确保安装了必要的npm包:

npm install express express-session connect-mongodb-session

示例代码

接下来,我们将创建一个基本的Express应用,并配置它使用MongoDB来存储session数据:

const express = require('express');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);

// 创建一个新的Express应用实例
const app = express();

// 连接字符串,指向你的MongoDB数据库
const store = new MongoDBStore({
  uri: 'mongodb://localhost:27017/mydatabase',
  collection: 'mySessions'
});

// 错误处理
store.on('error', function(error) {
  assert.ifError(error);
  assert.ok(false);
});

// 使用session中间件
app.use(session({
  secret: 'your_secret_key',
  cookie: { maxAge: 60000 }, // session的有效期(毫秒)
  store: store,
  resave: false,
  saveUninitialized: false
}));

// 路由示例
app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
    res.setHeader('Content-Type', 'text/html');
    res.write(`<p>访问次数: ${req.session.views}</p>`);
    res.end();
  } else {
    req.session.views = 1;
    res.end('欢迎访问本页面');
  }
});

// 启动服务器
const port = process.env.PORT || 3000;
app.listen(port, () => console.log(`Server running on port ${port}`));

解释

  • MongoDBStore: 这个库允许我们使用MongoDB来存储session数据。
  • secret: 用于加密session ID的密钥,必须保持安全。
  • cookie: 设置session的有效期,这里设置为60秒。
  • store: 指定我们使用的session存储方式,这里是MongoDB。
  • resavesaveUninitialized: 控制session的保存行为。

通过这种方式,无论你启动多少个Node.js进程,它们都可以共享同一个session存储,从而解决了session丢失的问题。


session丢失是什么原因?

有session的话,在mongodb或redis里存一下,就可以共享session相关信息了。

诶,session想存哪存哪儿,这都没关系。只要你有sessionId,你的问题估计是sessionid的问题,进程都用一个sessionID,不丢失才怪。

要实现 Node.js 多进程环境下的 session 共享,可以使用 MongoDB 作为存储后端。这使得不同进程可以访问相同的 session 数据。下面是一个简单的示例,展示如何使用 express-sessionconnect-mongo 模块来实现这一功能。

安装依赖

首先,确保安装了必要的 npm 包:

npm install express express-session connect-mongo mongodb

示例代码

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/sessionDB', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

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

app.get('/', (req, res) => {
    if (!req.session.views) {
        req.session.views = 0;
    }
    req.session.views++;
    res.send(`You have viewed this page ${req.session.views} times.`);
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. 连接到 MongoDB:

    • 使用 mongoose 连接到本地 MongoDB 实例。这里假设你已经在本地运行了 MongoDB。
  2. 配置 express-session:

    • 使用 MongoStore 存储 session 数据。通过传递 mongooseConnection 选项将 express-session 配置为使用 MongoDB。
  3. 路由处理:

    • 创建一个简单的路由,用于增加和显示 views 计数器。这展示了 session 数据是如何跨请求共享的。

启动 PM2

确保使用 PM2 正确地启动你的应用,以便在多进程环境中使用:

pm2 start app.js -i max

这样,-i max 参数会让 PM2 自动根据 CPU 内核数启动相应数量的工作进程,同时保持 session 的共享。

以上就是一个简单的实现方案,希望对你有所帮助。

回到顶部