如何在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.
相关产品推荐
相关产品推荐

