多次使用mongo连接返回无法使用已结束的会话



我在使用Mongo时遇到问题,请考虑:

const mongoose = require('mongoose');
const CONFIG = {
host: "localhost",
port: 27017,
db: "dev"
};
const url = `mongodb://${CONFIG.host}:${CONFIG.port}/${CONFIG.db}`;
const options = {
useNewUrlParser: true, 
useUnifiedTopology: true, 
useCreateIndex: true 
};
const checkMongoConnection = async () => {
return new Promise(async (resolve, reject) => {
if (mongoose.connection.readyState === 1) {
return resolve();
}
try {
await mongoose.connect(url, options);
return resolve();
} catch(error) {
console.log(error);
reject(error);
}
});
};
const disconnectMongo = async () => {
return new Promise(async (resolve, reject) => {
try {
await mongoose.disconnect();
return resolve();
} catch(error) {
console.log(error);
reject(error);
}
});
};
module.exports = {
checkMongoConnection,
disconnectMongo
}

我的数据库查询是这样的:

const User = require('./app/Models/User');
const { checkMongoConnection, disconnectMongo } = require(
'./app/util/mongo-connection-util'
);
const task1 = async () => {
try {
await checkMongoConnection();
const user = await User
.findOne()
console.log(user._id);
await disconnectMongo();
} catch(error) {
console.log(error);
}
};
task1()
task1()

问题是,如果我用task1调用对数据库进行查询,然后立即再次查询,我会得到错误Cannot use a session that has ended。如果我只调用一次函数,就没有问题。

我知道这是因为连接已经在使用中,如果我使用await并以串行方式执行功能,等待第一个完成后再执行下一个,代码就会工作。

然而,我想在一组API调用之后进行数据库调用,所以它在不同的时间是异步的。是否有可能实现这一点,或者所有数据库调用都必须一个接一个?

除非您有不同的文档指示,或者有需要不同行为的明确用例,否则您应该为每个进程创建一次驱动程序的MongoClient对象,并在进程的整个生命周期中使用该对象。

换句话说,删除所有断开MongoClients连接的代码。

如果您想让MongoClient作用域到一个操作,请使用官方文档中提供的模式,这些模式不涉及全局存储客户端。

最新更新