我想利用猫鼬的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
以外的其他方式。
答案 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
它还支持事务选项,请参阅有关如何操作的文档。