javascript - 使用 NodeJS 将卡添加到 Stripe 客户

标签 javascript node.js express stripe-payments

我正在 NodeJS 应用程序中构建 addCard Controller ,以向现有的 stripe 客户添加卡。目前我让它与以下代码一起工作:

const user = await User.findById(req.params.user_id)

    //Send error if user is not found
    if(!user){
        return next(new ErrorResponse('Resource not found', 404))
    }
await Stripe.customers.retrieve(
        user.stripe.customer_id,
        async function(err, customer) {
            if (err){
                return next(new ErrorResponse(err.message, err.statusCode))
            } else{
                if(customer.sources.data.length > 0){
                    return next(new ErrorResponse('User already has a card on file', 403));
                } else{
                    //If no card on file, create a new card for the user
                    await Stripe.customers.createSource(
                        user.stripe.customer_id,
                        {source: req.body.cardtok}, //card token generated by client
                        async function(err, card) {
                            if(err){
                                return next(new ErrorResponse(err.message, err.statusCode));
                            } else{
                                res.status(200).json({
                                    success: true,
                                    data: card
                                });            
                            }
                        }
                    );

                }
            }
        }
    );

还有更好的办法吗?虽然我的代码确实按预期工作,但我无法避免认为有点困惑。我正在使用 Node、express 和 mongodb。

最佳答案

看起来你在这里混淆了异步/等待和回调;我认为你可以这样做:

const user = await User.findById(req.params.user_id);

//Send error if user is not found
if (!user) {
  return next(new ErrorResponse("Resource not found", 404));
}

let customer;
try {
  customer = await Stripe.customers.retrieve(user.stripe.customer_id);
} catch (err) {
  return next(new ErrorResponse(err.message, err.statusCode));
}

if (customer.sources.data.length > 0) {
  return next(new ErrorResponse("User already has a card on file", 403));
}

//If no card on file, create a new card for the user
let card;

try {
  card = Stripe.customers.createSource(
    user.stripe.customer_id,
    { source: req.body.cardtok } //card token generated by client
  );
} catch (err) {
  return next(new ErrorResponse(err.message, err.statusCode));
}

res.status(200).json({
  success: true,
  data: card,
});

关于javascript - 使用 NodeJS 将卡添加到 Stripe 客户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61515094/

相关文章:

javascript - Webpack 构建在 node_modules 上显示 TS 错误,而不是我的代码

node.js - Express.js req.session 在路由中未定义

node.js - 如何将请求IP从NGINX转发到node.js应用程序?

javascript 游戏关卡继承

javascript - 在 Windows 虚拟机上将 Node.js 与 Cassandra 连接时出错

node.js - 使用 Nodemon 每次保存时都会生成 EADDRINUSE

javascript - 在公共(public) Assets 目录中包含 .html 文件?

javascript - HTML 按钮点击顺序还是并行?

javascript - 如何从一个jsp函数调用另一个jsp函数的javascript函数

javascript - 快速路由 - 数据库调用和范围