我真的需要你的帮助。我的MongoDB交易与@NestJs/mongoose不工作...当我的条纹支付失败回滚不工作...尽管如此,我的订单收集保存了数据...我该如何解决这个问题...?
async create(orderData: CreateOrderServiceDto): Promise<any> {
const session = await this.connection.startSession();
session.startTransaction();
try {
const createOrder = new this.orderModel(orderData);
const order = await createOrder.save();
await this.stripeService.charge(
orderData.amount,
orderData.paymentMethodId,
orderData.stripeCustomerId,
);
await session.commitTransaction();
return order;
} catch (error) {
await session.abortTransaction();
throw error;
} finally {
await session.endSession();
}
}
1条答案
按热度按时间2hh7jdfx1#
我也有同样的问题,我发现在github:Mongo DB Transactions With Mongoose & Nestjs
所以我认为,根据这个问题,你必须调用你的模型的
create
方法,就像这样:正如您所看到的,
Model.create
方法有一个重载,它以SaveOptions
作为参数:它采用可选的
SaveOptions
参数,该参数可以包含会话:请注意,
Model.save()
也可以带SaveOptions
参数,所以您也可以像这样做:再往前一点...
由于我做的许多事情都需要事务,所以我提出了这个帮助器来避免许多代码重复:
详细信息
可选参数
session
是在你正在做嵌套事务的情况下。这就是为什么我检查会话是否被提供。如果是,这意味着我们在一个嵌套事务中。所以我们将让主事务提交,中止和结束会话。示例
例如:您删除了一个
User
模型,然后删除了用户的头像(File
模型)。因此,简而言之:
您可以像这样使用它:
希望能有所帮助。
编辑
不要在嵌套事务中滥用相同模型的
model.save({ session })
。由于某些原因,模型更新太多次会引发错误。为了避免这种情况,最好使用模型嵌入方法,这些方法更新并返回模型的新示例(例如
model.findOneAndUpdate
)。