簡體   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