Nodejs 使用Mongodb副本集,前端express如何保存session

Nodejs 使用Mongodb副本集,前端express如何保存session

请教大家一个问题,我在后台有2个mongodb,运用了副本集 那么我在express中 store: new MongoStore({ url: require(’./config’).db })

这个url应该怎么配置呢?

4 回复

当然可以。在使用 Node.js 和 Express 框架时,结合 MongoDB 副本集来保存 session 是一个常见的需求。下面是一个具体的步骤和示例代码来说明如何实现这一点。

步骤概述

  1. 配置 MongoDB 连接字符串:需要配置一个连接字符串,该字符串指向你的 MongoDB 副本集。
  2. 安装必要的依赖:确保你已经安装了 express-sessionconnect-mongo 包。
  3. 初始化 Session 中间件:使用 express-sessionMongoStore 来保存 session 数据。

示例代码

安装必要的依赖包

首先,你需要安装 express-sessionconnect-mongo

npm install express express-session connect-mongo mongodb

配置 MongoDB 连接字符串

假设你的 MongoDB 副本集包含三个节点(主节点和两个从节点),连接字符串应该类似于:

const dbConfig = {
    url: 'mongodb://<primary-hostname>:<port>,<secondary-hostname-1>:<port>,<secondary-hostname-2>:<port>/mydatabase?replicaSet=<replica-set-name>'
};

例如:

const dbConfig = {
    url: 'mongodb://localhost:27017,localhost:27018,localhost:27019/mydatabase?replicaSet=myReplicaSet'
};

初始化 Session 中间件

在你的 Express 应用中,初始化 session 中间件并使用 MongoStore 存储 session 数据:

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(dbConfig.url, { 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) => {
    req.session.user = 'John Doe';
    res.send('Session saved to MongoDB replica set.');
});

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

解释

  • 连接字符串dbConfig.url 包含了副本集的所有节点信息,以及数据库名称和副本集名称。
  • MongoStore:通过 mongooseConnection 参数指定连接到 MongoDB 的会话存储。
  • session 中间件:配置 session 中间件,并将 session 存储到 MongoDB。

这样配置后,你的 Express 应用就可以将 session 数据持久化到 MongoDB 副本集中,即使在副本集中的不同节点之间切换也不会丢失 session 数据。


使用connect-mongostore https://github.com/diversario/connect-mongostore

app.use(express.session({
    secret: 'my secret',
    store: new MongoStore(replicaSet)
  }));
var replicaSet = {
  "collection" : "express_sessions",
  "stringify": false,
  "db": {
    "name" : "sessions",
    "servers" : [
      {
        "host" : "localhost",
        "port" : 27017,
        "options" : {
          "autoReconnect" : false,
          "poolSize" : 200,
          "socketOptions" : {
            "timeout" : 0,
            "noDelay" : true,
            "keepAlive" : 1,
            "encoding" : "utf8"
          }
        }
      },
      {
        "host" : "localhost",
        "port" : 27018,
        "options" : {
          "autoReconnect" : false,
          "poolSize" : 200,
          "socketOptions" : {
            "timeout" : 0,
            "noDelay" : true,
            "keepAlive" : 1,
            "encoding" : "utf8"
          }
        }
      },
      {
        "host" : "localhost",
        "port" : 27019,
        "options" : {
          "autoReconnect" : false,
          "poolSize" : 200,
          "socketOptions" : {
            "timeout" : 0,
            "noDelay" : true,
            "keepAlive" : 1,
            "encoding" : "utf8"
          }
        }
      }
    ]
  }
}

太感谢您了,一会实验一下

当使用MongoDB副本集时,你需要确保你的连接字符串(即url)指向副本集的主节点或一个种子列表。副本集的URL应该包含所有副本集成员的地址,以便在主节点不可用时能够自动切换到其他副本。

示例代码

假设你的副本集由三个节点组成,分别是192.168.1.100:27017192.168.1.101:27017192.168.1.102:27017,你可以这样配置:

// config.js
module.exports = {
  db: 'mongodb://192.168.1.100:27017,192.168.1.101:27017,192.168.1.102:27017/your-database-name?replicaSet=your-replica-set-name'
};

然后在Express应用中使用connect-mongo来保存Session:

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

const app = express();

app.use(session({
  store: new MongoStore({
    url: require('./config').db,
    touchAfter: 24 * 3600 // 减少对数据库的写入次数
  }),
  secret: 'your-secret-key',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: true } // 如果使用HTTPS,应设置为true
}));

mongoose.connect(require('./config').db, {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

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

解释

  • require('./config').db 获取数据库连接字符串。
  • MongoStore 用于将Session存储到MongoDB中。
  • touchAfter 配置Session数据更新的时间间隔,以减少对数据库的频繁写入操作。
  • mongoose.connect 用于连接到MongoDB副本集。

确保副本集的名称与配置文件中的名称一致,并且所有副本集成员都已正确配置。

回到顶部