我使用mongoose通过我的nodejs服务器连接到我的Mongodb Atlas集群。
有一个特定的操作是作为一个事务来完成的。Mongoose需要调用mongoose.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:[email protected]/mydb?retryWrites=true&w=majority';
mongoose.connect(dburl, {useNewUrlParser: true}, err => {
if (err) {
log.warn('Error occurred when connecting to database. ' + err);
}
});
型
这可能是什么原因?这可能是由于数据库的一些错误?有什么方法可以进一步解决这个问题?
3条答案
按热度按时间piwo6bdm1#
我通过使用来自
mongoose.createConnection(uri, options)
的连接对象解决了这个问题字符串
mongoose.connection
与此连接对象不同。bis0qfac2#
在我的例子中,当我创建一个会话时,它经常挂起,但后来我做了以下操作,我成功地创建了一个mongodb事务:
例如,从一个帐户转移一些金额到另一个帐户:
创建我的帐户架构:
字符串
让我们初始化mongodb连接:
型
现在我的路由器看起来像:
型
做
mwg9r5ms3#
这看起来像是mongoose中的一个bug,我向mongoose报告了它,但仍然没有得到回应。
https://github.com/Automattic/mongoose/issues/8325
我写了下面的函数,我可以用它来等待mongoose连接准备好,然后再调用
startSession()
,它解决了我的问题。字符串
有了上面的函数,我可以像下面这样开始会话:
型
请注意,我必须关闭
useUnifiedTopology
。否则,'reconnect'不会被调用。型