基于Node.js的Mongoose连接池配置及多MongoDB实例连接方案
用Mongoose连接多个MongoDB实例(不同端口)
嘿,很高兴能帮你搞定这个问题!当你需要连接多个不同的MongoDB实例(不管是不同端口还是不同地址)时,Mongoose的全局mongoose.connect()就不够用了——我们需要用mongoose.createConnection()来创建独立的连接对象,每个对象对应一个MongoDB实例。
核心思路
原来的mongoose.connect()是创建一个全局默认连接,而createConnection()会返回一个独立的连接实例,你可以用它来绑定对应数据库的模型、执行操作,多个实例之间完全隔离。
修改后的完整代码
我把你原来的代码改成了支持双实例连接的版本,同时更新了Mongoose的连接选项(旧的useMongoClient已经废弃,换成了新版推荐的配置):
var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var session = require('express-session'); var MongoStore = require('connect-mongo')(session); var mongoose = require('mongoose'); // 配置Promise(保持你的原有设置) mongoose.Promise = global.Promise; // 👉 创建第一个MongoDB实例连接(端口27017,数据库db1) const db1Connection = mongoose.createConnection('mongodb://127.0.0.1:27017/db1', { useNewUrlParser: true, useUnifiedTopology: true }); // 👉 创建第二个MongoDB实例连接(端口27018,数据库db2) const db2Connection = mongoose.createConnection('mongodb://127.0.0.1:27018/db2', { useNewUrlParser: true, useUnifiedTopology: true }); // 监听连接状态(可选但推荐,方便排查问题) db1Connection.on('error', console.error.bind(console, 'db1连接错误:')); db1Connection.once('open', () => { console.log('✅ 成功连接到db1'); }); db2Connection.on('error', console.error.bind(console, 'db2连接错误:')); db2Connection.once('open', () => { console.log('✅ 成功连接到db2'); }); // 示例:定义Schema并绑定到对应的连接 const userSchema = new mongoose.Schema({ name: String, email: String }); const productSchema = new mongoose.Schema({ title: String, price: Number }); // 👉 把模型绑定到对应的连接,而不是全局mongoose const User = db1Connection.model('User', userSchema); // 属于db1的模型 const Product = db2Connection.model('Product', productSchema); // 属于db2的模型 // 剩下的Express配置保持你的原有逻辑 var app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // 如果你需要用MongoDB存session,可以指定其中一个连接(比如db1) app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: false, store: new MongoStore({ mongooseConnection: db1Connection }) })); // 后续的路由和业务逻辑示例 app.get('/users', async (req, res) => { const users = await User.find(); // 从db1查询用户 res.json(users); }); app.get('/products', async (req, res) => { const products = await Product.find(); // 从db2查询商品 res.json(products); }); app.listen(3000, () => { console.log('服务器运行在http://localhost:3000'); });
关键注意事项
- 模型绑定:一定要用对应连接实例的
model()方法创建模型,而不是全局的mongoose.model(),否则模型会默认绑定到全局连接(如果有的话),导致操作错误的数据库。 - 连接选项:替换掉旧的
useMongoClient,改用useNewUrlParser和useUnifiedTopology,这是Mongoose 5.x+版本的推荐配置,能避免过时警告。 - 独立隔离:两个连接是完全独立的,各自的操作、事务都不会互相影响,你可以根据业务需求分别操作不同的数据库。
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

