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

如何在Nuxt 3/Vue 3中用Mongoose连接双MongoDB并在服务端路由切换

在Nuxt 3中使用Mongoose连接多个MongoDB数据库并切换

1. 配置多数据库连接

在server/utils目录下创建数据库连接工具文件(比如db.js),通过Mongoose创建独立的连接实例,避免共享默认连接:

import mongoose from 'mongoose'

// 存储两个数据库连接实例
let db1Connection = null
let db2Connection = null

// 连接第一个数据库
export async function getDb1Connection() {
  if (db1Connection && db1Connection.readyState === 1) {
    return db1Connection
  }
  db1Connection = await mongoose.createConnection(process.env.NUXT_DB1_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  db1Connection.on('open', () => console.log('DB1 连接成功'))
  db1Connection.on('error', (err) => console.error('DB1 连接失败:', err))
  return db1Connection
}

// 连接第二个数据库
export async function getDb2Connection() {
  if (db2Connection && db2Connection.readyState === 1) {
    return db2Connection
  }
  db2Connection = await mongoose.createConnection(process.env.NUXT_DB2_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  db2Connection.on('open', () => console.log('DB2 连接成功'))
  db2Connection.on('error', (err) => console.error('DB2 连接失败:', err))
  return db2Connection
}

在.env文件中添加两个数据库的连接字符串:

NUXT_DB1_URI=mongodb://localhost:27017/db1
NUXT_DB2_URI=mongodb://localhost:27017/db2

2. 为不同数据库定义模型

模型需要绑定到对应的连接实例上,而非Mongoose的默认连接。在server/models目录下分别定义两个数据库的模型:

DB1的User模型(server/models/db1/User.js)

import { getDb1Connection } from '../../utils/db'

export default async function UserModel() {
  const db1 = await getDb1Connection()
  return db1.model('User', new mongoose.Schema({
    name: String,
    email: String
  }))
}

DB2的Log模型(server/models/db2/Log.js)

import { getDb2Connection } from '../../utils/db'

export default async function LogModel() {
  const db2 = await getDb2Connection()
  return db2.model('Log', new mongoose.Schema({
    action: String,
    timestamp: Date
  }))
}

3. 在服务端路由中使用指定数据库

直接在服务端API路由中导入对应模型,操作目标数据库即可:

操作DB1的路由(server/api/db1/users.get.js)

import UserModel from '../../models/db1/User'

export default defineEventHandler(async (event) => {
  const User = await UserModel()
  return await User.find()
})

操作DB2的路由(server/api/db2/logs.get.js)

import LogModel from '../../models/db2/Log'

export default defineEventHandler(async (event) => {
  const Log = await LogModel()
  return await Log.find()
})

如果需要在同一个路由中动态切换数据库,可根据请求参数判断:

import UserModel from '../../models/db1/User'
import LogModel from '../../models/db2/Log'

export default defineEventHandler(async (event) => {
  const { db } = getQuery(event)
  if (db === 'db1') {
    const User = await UserModel()
    return await User.find()
  } else if (db === 'db2') {
    const Log = await LogModel()
    return await Log.find()
  }
  return { error: '无效的数据库标识' }
})

关键注意事项

  • 必须用mongoose.createConnection()而非mongoose.connect(),后者会覆盖默认连接,导致多数据库冲突
  • 对连接实例做单例处理,避免重复创建连接
  • 模型必须绑定到对应连接实例,否则会默认使用第一个连接的数据库

内容的提问来源于stack exchange,提问作者Jannis M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:21