如何解决MongoError:没有事务开始
我第一次使用猫鼬交易。根据文档和一些文章,我能够使用 run-rs 对其本地副本进行运行。但是,我遇到了两个问题,
- 即使事务反映在副本集上,猫鼬也总是抛出错误 MongoError:未启动事务。我已尝试检查解决方案,但找不到任何解决方案。
- 成功完成交易后,还有另一个异步功能,旨在发送通知电子邮件。但是,我意识到以某种方式,此通知电子邮件功能在交易发生之前运行,然后 transaction功能第二次运行。我猜想这可能与承诺有关,如果我错了,请纠正我。
这是两个函数的样子。
await transactionDb
.handleMoneyTransfer({
senderId,receiverId: paymentInfo.getReceiver(),amount: paymentInfo.getAmountToPay(),ref
})
return await sendNotificationEmail({ ref,user })
首先运行handleMoneyTransfer
函数,然后运行sendNotificationEmail
,但这不是这种情况。
这是处理下面列出的猫鼬交易的代码。
async function handleMoneyTransfer({ senderId,receiverId,amount,ref }) {
const session = await mongoose.startSession()
try {
const sender = await User.findOne({ _id: senderId }).session(session)
sender.balance -= amount
await sender.save({ session })
const receiver = await User.findOne({ _id: receiverId }).session(session)
// receiver.balance += amount
const transactionInfo = await Transaction.findOne({
reference: ref
}).session(session)
const newEscrow = await new Escrow({
amount,reference: ref,buyerInfo: {
buyerId: sender._id,email: sender.email
},sellerInfo: {
sellerId: receiverId,email: receiver.email
},currentTransaction: {
transaction: transactionInfo
}
})
await newEscrow.save({ session })
await session.commitTransaction()
} catch (error) {
await session.abortTransaction()
} finally {
session.endSession()
}
}
这是我使用猫鼬进行连接的方式
const setupDB = async (uri,dbUrl) => {
try {
await mongoose.connect(`${uri}/${dbUrl}`,{
useUnifiedTopology: true,useNewUrlParser: true,replicaSet: 'rs'
})
console.log('Connected')
} catch (e) {
return console.log(e)
}
}
已翻译为此
setupDB(
'mongodb://DESKTOP-SNA1HQK:27017,DESKTOP-SNA1HQK:27018,DESKTOP-SNA1HQK:27019','escrow?replicaSet=rs'
)
现在,我坚持要修复No transaction started
错误,并让这些功能按其放置顺序运行。
非常感谢您的帮助,在此先感谢您。
解决方法
您似乎错过了transaction的实际开始位置。将以下内容添加到您的代码中应该可以解决该问题:
<section class="banner cover-bg">
<div class="container h-100">
<div class="row align-items-center h-100">
<div class="col-12 caption text-center">
<h2></h2>
<h4></h4>
</div>
</div>
</div>
</section>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。