gpt4 book ai didi

javascript - MongoError : No transaction started

转载 作者:行者123 更新时间:2023-12-04 09:03:32 25 4
gpt4 key购买 nike

我第一次使用 Mongoose 事务。按照文档和一些文章,我能够使用 让它运行起来。运行-rs 对于本地副本。但是,我遇到了两个问题,

  • 即使事务反射(reflect)在副本集上, Mongoose 总是抛出错误 MongoError: 没有交易开始 .我试过检查解决方案,但找不到任何解决方案来解决这个问题。
  • 交易成功完成后,还有另一个异步函数用于发送通知电子邮件。然而,我意识到不知何故,这个通知电子邮件功能在交易发生之前运行,然后交易功能运行第二。我猜这可能与 promise 有关,如果我错了,请纠正我。

  • 下面是这两个函数的样子。
    await transactionDb
    .handleMoneyTransfer({
    senderId,
    receiverId: paymentInfo.getReceiver(),
    amount: paymentInfo.getAmountToPay(),
    ref
    })
    return await sendNotificationEmail({ ref, user })
    handleMoneyTransfer函数意味着首先运行,然后是 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 错误并让这些函数按照它们的放置顺序运行。
    非常感谢您的帮助,在此先感谢您。

    最佳答案

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

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

    }

    关于javascript - MongoError : No transaction started,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63509996/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com