繁体   English   中英

MongoError:没有交易开始

[英]MongoError: No transaction started

我是第一次使用 mongoose 事务。 按照文档和一些文章,我能够使用run-rs 运行本地副本。 但是,我遇到了两个问题,

  1. 即使事务反映在副本集上,mongoose 总是抛出错误MongoError: No transaction started 我已尝试检查解决方案,但找不到任何解决此问题的方法。
  2. 成功完成交易后,还有另一个异步 function 用于发送通知电子邮件。 但是,我意识到不知何故,此通知 email function在事务发生之前运行,然后事务 function运行第二。 我猜这可能与承诺有关,如果我错了,请纠正我。

这是这两个函数的样子。

await transactionDb
       .handleMoneyTransfer({
            senderId,
            receiverId: paymentInfo.getReceiver(),
            amount: paymentInfo.getAmountToPay(),
            ref
          })
return await sendNotificationEmail({ ref, user })

handleMoneyTransfer function 意味着首先运行,然后sendNotificationEmail意味着接下来运行,但这里不是这种情况。

这是处理下面列出的 mongoose 事务的代码。

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()
    }
  }

这是我使用 mongoose 进行连接的方法

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错误,并让这些函数按照它们放置的顺序运行。

非常感谢您的帮助,在此先感谢您。

您似乎错过了事务的实际开始。 将以下内容添加到您的代码中应该可以解决此问题:

async function handleMoneyTransfer({ senderId, receiverId, amount, ref }) {
    const session = await mongoose.startSession()
    session.startTransaction();
    // rest of your code

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM