node.js - 猫鼬 startSession() 挂起
问题描述
我正在使用 mongoose 通过我的 nodejs 服务器连接到我的 Mongodb Atlas 集群。
有一个特定的操作是作为一个事务完成的。需要调用 Mongoosemongoose.startSession()
来启动事务。非常罕见的是,此mongoose.startSession()
呼叫会无限期挂起。没有确定的方法可以重现这一点。
log.info('starting lock session');
const mongoSession = await mongoose.startSession();
log.info('lock session started');
在上面的代码中,starting lock session.
会被记录,但lock session started
在出现问题时不会被记录。
我连接到数据库,如下所示:
const dburl = 'mongodb+srv://myuser:mypassword@myapp.mongodb.net/mydb?retryWrites=true&w=majority';
mongoose.connect(dburl, {useNewUrlParser: true}, err => {
if (err) {
log.warn('Error occurred when connecting to database. ' + err);
}
});
这可能是什么原因?这可能是由于数据库有问题吗?有什么办法可以进一步解决这个问题吗?
解决方案
这看起来像是猫鼬中的一个错误,我向猫鼬报告了它,但仍然没有得到回应。
https://github.com/Automattic/mongoose/issues/8325
我写了以下函数,我可以用它来等到猫鼬连接准备好再调用startSession()
,它解决了我的问题。
function waitForMongooseConnection(mongoose) {
return new Promise((resolve) => {
const connection = mongoose.connection;
if (connection.readyState === 1) {
resolve();
return;
}
console.log('Mongoose connection is not ready. Waiting for open or reconnect event.');
let resolved = false;
const setResolved = () => {
console.log('Mongoose connection became ready. promise already resolved: ' + resolved);
if (!resolved) {
console.log('Resolving waitForMongooseConnection');
resolved = true;
resolve();
}
};
connection.once('open', setResolved);
connection.once('reconnect', setResolved);
});
}
使用上述功能,我可以像下面这样开始会话:
log.info('starting session');
await waitForMongooseConnection(mongoose);
const mongoSession = await mongoose.startSession();
log.info('session started');
请注意,我必须关闭useUnifiedTopology
. 否则,不会调用“重新连接”。
mongoose.connect(config.db, {useNewUrlParser: true, useUnifiedTopology: false}, err => {
if (err) {
log.warn('Error occurred when connecting to database. ' + err);
}
});
推荐阅读
- google-cloud-platform - 在 IAP 中使用“云身份验证登录”进行身份验证后,如何限制用户仅使用他的用户名(通过该用户名进行身份验证)?
- facebook-graph-api - 如何使用 Graph API 从公共页面获取帖子?
- r - 如何重新排列 R 数据框中不同列中的值
- javascript - 在反应中,我有 JQuery npm,我在我的 chart-custom.js 文件中使用了 JQuery,但仍然收到 jQuery undefined 错误
- python - 导入后覆盖模块函数 - Python
- vba - VBA selenium 单击附近的网格列
- python - 使用 str.contains 创建新列 Pandas df 给出:值的长度与索引的长度不匹配
- c# - 如何根据 SQLite DB 表中的表制作 Picker 显示选项?
- node.js - 带有温度传感器的 SocketIO - 我几乎用 NodeJS 和 SocketIO 在我的 Raspberry Pi 上完成了 DS18B20,如何提取 Promise { data }?
- google-maps - 颤动谷歌地图缩放控制位置