首页 > 解决方案 > Express Js - 按需连接MongoDB数据库

问题描述

我正在开发一个应用程序,该应用程序需要根据正在访问我的应用程序的客户连接到不同的 MongoDB 数据库。每个 MongoDB 数据库都位于不同的服务器上。

例如,如果我的应用程序有 3 个不同的客户:

当 john 使用我的应用程序时,Express.js 应该连接到mongodb://john:john@server1/john或者当 harry 使用我的应用程序时,它应该连接到mongodb://harry:harry@server3/harry.

我想知道实现这一目标的优化方法是什么。通常,当我们只有一个 MongoDB 数据库实例时,我们将mongoose.connect方法放在app.jsExpress.js 服务器启动时调用的 and 中,但在这种情况下,我不想同时连接所有三个数据库,因为那样不会优化的方式。

标签: node.jsmongodb

解决方案


根据Mongoose 文档,它确实支持连接到多个主机。

const conn1 = mongoose.createConnection('host1', options)
const conn2 = mongoose.createConnection('host2', options)

让我举个例子(这是 Express 代码):

// CONNECTION SETTER MIDDLEWARE
app.use(async function (req, res, next) {
    // Let's just assume you identified the user earlier with your favourite 
    // auth method and put their identity in req.user
    const userCon = await mongoose.createConnection(`mongodb://${req.user.username}:${req.user.password}@${req.user.host}/${req.user.database}`) // Here you have it!
    // Saving the connection in the request so the next 
    // middlewares/handlers can access it
    req.user.connection = userCon
    // Thank you, next (middleware/handler)
    next()
});

虽然mongoose.connect()设置默认连接,mongoose.createConnection()但只返回一个连接。

这是我会尝试的,这是 Mongoose 推荐的处理多个连接的方法。您应该注意,您不能跨不同的连接共享模型,但您可以共享模式。

如果您只想初始化连接并稍后连接,Mongoose 文档还提供了一个示例

// initialize now, connect later
db = mongoose.createConnection();
db.openUri('localhost', 'database', port, [opts]);

推荐阅读