Nodejs 使用Mongodb副本集,前端express如何保存session
Nodejs 使用Mongodb副本集,前端express如何保存session
请教大家一个问题,我在后台有2个mongodb,运用了副本集 那么我在express中 store: new MongoStore({ url: require(’./config’).db })
这个url应该怎么配置呢?
当然可以。在使用 Node.js 和 Express 框架时,结合 MongoDB 副本集来保存 session 是一个常见的需求。下面是一个具体的步骤和示例代码来说明如何实现这一点。
步骤概述
- 配置 MongoDB 连接字符串:需要配置一个连接字符串,该字符串指向你的 MongoDB 副本集。
- 安装必要的依赖:确保你已经安装了
express-session
和connect-mongo
包。 - 初始化 Session 中间件:使用
express-session
和MongoStore
来保存 session 数据。
示例代码
安装必要的依赖包
首先,你需要安装 express-session
和 connect-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:27017
、192.168.1.101:27017
和192.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副本集。
确保副本集的名称与配置文件中的名称一致,并且所有副本集成员都已正确配置。