我在使用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作用域到一个操作,请使用官方文档中提供的模式,这些模式不涉及全局存储客户端。