You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:29