猫鼬从withTransaction回调返回值

时间:2020-07-12 00:03:41

标签: javascript node.js mongodb mongoose transactions

我想利用猫鼬的withTransaction助手,特别是因为它具有自动重试瞬时事务错误的能力。但是,看来withTransaction帮助程序无法返回数据,这对我来说是个问题。

我的代码如下:

import { startSession } from 'mongoose';

async addItem(itemData) {
    const session = await startSession();
 
    session.startTransaction();
    try {
        const item = await new Item({ itemData }).save({ session });
        
        // a bunch of other async operations...

       await session.commitTransaction();
       session.endSession();

       return item;
    } catch (error) {
        await session.abortTransaction();
        session.endSession();
        throw error;
    }
}

我如何(1)使用withTransaction帮助程序,但仍然像现在一样使用此函数返回item,或者(2)使该函数通过某些操作自动重试瞬时事务错误除了使用withTransaction以外的其他方式。

2 个答案:

答案 0 :(得分:2)

这似乎是节点驱动程序中的known issue。该票证中提供了一些解决方法。

答案 1 :(得分:0)

我编写了一个简单的帮助程序,它在内部使用 withTransaction 来解决问题并使用 mongoose 使事务不那么冗长。

安装 mongoose-trx 后,您只需执行以下操作:

const transaction = require('mongoose-trx');

const [customer] = await transaction(session => Customer.create([{ name: 'Test' }], { session }));

// do whatever you need to do with the customer then return it

它还支持事务选项,请参阅有关如何操作的文档。