当我在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?实现这一点呢?
1条答案
按热度按时间zujrkrfu1#
您可以将上述内容封装在一个try catch中。如果创建Stripe客户失败,则没有任何操作需要回滚,因为这是第一个操作。如果创建优惠券失败,则如何在catch块中处理该操作取决于您(您可以允许用户重试,也可以delete the customer created in Stripe等)。如果在数据库中创建用户失败,那么你可以在catch块中delete the customer in Stripe并将促销代码标记为不活动.它看起来不像有一种方法可以删除促销代码.