在尝试限制 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() 只允许您通过返回的新连接对象快速访问不同的数据库?
我刚刚开始使用猫鼬,所以请原谅任何错误,如果这些答案直接在他们的文档中说明。
这里试试这个:
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);
}
}