如何在同一个事务中同时回滚对API和MongoDB服务器的更改?或者有可能吗?

polkgigr  于 2022-12-18  发布在  Go
关注(0)|答案(1)|浏览(157)

当我在NodeJS应用程序中注册用户时,我有以下代码:

// BEGIN TRANSACTION

const new_customer = await stripe.customers.create({
  name: req.body.name,
  email: req.body.email,
});

const new_coupon = await stripe.promotionCodes.create({
  coupon: 'New-user-discount',
  customer: new_customer.id,
  code: "NEWUSER10",
  expires_at: new Date(Date.now() + 24 * 60 * 60 * 1000), // expires in 24 hours
  max_redemptions: 1,
});

const new_user = await User.create({
  name: req.body.name,
  email: req.body.email,
  pword: hash(req.body.pword),
  stripe_customer_id: new_customer.id,
});

// END TRANSACTION

其中两个操作是在我的stripe帐户上执行的,最后一个操作是在我的数据库上执行的。但是,如果其中一个操作失败,我不希望(例如)在没有用户也被添加到我的数据库的情况下注册stripe客户。我理解这就是事务回滚的目的,但是我如何在我的场景中使用NodeJS?实现这一点呢?

zujrkrfu

zujrkrfu1#

您可以将上述内容封装在一个try catch中。如果创建Stripe客户失败,则没有任何操作需要回滚,因为这是第一个操作。如果创建优惠券失败,则如何在catch块中处理该操作取决于您(您可以允许用户重试,也可以delete the customer created in Stripe等)。如果在数据库中创建用户失败,那么你可以在catch块中delete the customer in Stripe并将促销代码标记为不活动.它看起来不像有一种方法可以删除促销代码.

相关问题