切换默认mongoose连接的数据库

问题描述 投票:0回答:1

在尝试限制 Web 应用程序中的连接数时,我从使用 mongoose.createConnection() 切换到 mongoose.connect()

如果您只使用一个数据库,那么这非常有效。对我来说不幸的是,我正在使用一对,并且希望轻松、毫不费力地在它们之间切换,而不创建新的连接或为边缘情况留出空间。

我发现您可以使用 mongoose.connection.useDB() 来更改数据库,而无需创建新的连接池。然后该函数返回一个可以使用的新连接对象。但由于某种原因,应该返回默认连接数据库名称的 mongoose.connection.db.databaseName 没有显示更改。

这是代码

export async function dbConnect(dbName){
    const options = {
        dbName: dbName,
        socketTimeoutMS: 20000
    }
    try{
        if(mongoose.connection.db){
            console.log("already a connection: checking name")
            if(mongoose.connection.db.databaseName === dbName){
                console.log("name is the same")
                return
            }else{
                console.log("changing db")
                const newconnection = mongoose.connection.useDb(dbName, { useCache: true })
                console.log(await newconnection.db.databaseName)
            }
        }
        else {await mongoose.connect(process.env.MONGODB_URI, options)}
    }catch(error){
        console.log(error)
    }
}

请注意,console.log(await newconnection.db.databaseName) 确实会记录新数据库名称,但 mongoose.connection.db.databaseName 不会。

显然,这不是一个问题,而是猫鼬连接系统如何工作的问题。我想知道 mongoose.connection.db 是否设置为连接到的第一个数据库,并且如果未显式使用 .useDb() ,则永久回退到该数据库。这意味着它无法更改,并且 .useDb() 只允许您通过返回的新连接对象快速访问不同的数据库?

我刚刚开始使用猫鼬,所以请原谅任何错误,如果这些答案直接在他们的文档中说明。

javascript reactjs node.js mongoose next.js
1个回答
0
投票

这里试试这个:

export async function dbConnect(dbName){
const options = {
    dbName: dbName,
    socketTimeoutMS: 20000
};

try {
    // Check if a connection already exists
    if (mongoose.connection.readyState) {
        console.log("Already a connection: checking name");

        // Switch to the desired database using useDb()
        const newConnection = mongoose.connection.useDb(dbName, { 

useCache: true });
            console.log(newConnection.db.databaseName);
            return newConnection;
        } else {
            // Establish a new connection if none exists
            await mongoose.connect(process.env.MONGODB_URI, options);
        }
    } catch (error) {
        console.log(error);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.