错误:发送邮件后无法设置标头

时间:2018-02-04 11:55:18

标签: javascript node.js server stripe-payments

我在发送标题后无法设置标题'在Heroku上使用Stripe API运行项目时出错。通过大量的搜索,我认为在return;send()之前没有拨打render(),但我已经尝试过了不确定它的意图。

我的代码:

app.post('/charge', (req, res) => {
  const amount = 999;

  const plan = stripe.plans.create({
    currency: 'gbp',
    interval: 'month',
    name: 'XXXX',
    amount: 999
  });

  stripe.customers.create({
    email: req.body.stripeEmail,
    source: req.body.stripeToken
  })
  .then(customer => stripe.charges.create({
    amount,
    description: 'XXXX',
    currency: 'gbp',
    customer: customer.id
  }, function(err, subscription){
    if(err){
      res.send({
        success: false,
        message: 'Error'
      });
    } else {
      const {id} = customer;
      stripe.subscriptions.create({
        customer: id,
        items: [
          {
            plan: 'XXXXX'
          }
        ]
      }, function(err,subscription){
        if(err){
          res.send({
            success: false,
            message: 'Error'
          });
        } else {
          res.send({
            success: true,
            message: 'success'
          });
        }
      });
    }
  }))
  .then(charge => res.render('success'));
});

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

  

当您在为同一请求发送响应(即res.send()两次后尝试设置标头时,会出现此错误。

在你的代码中,我想在一个错误块的res.send()之后,第二个错误块正在执行。

如果可能,请尝试仅使用承诺或仅使用回调,它很容易调试。

您可以像这样优化代码 -

 stripe.customers.create(ob1)
     .then(res1 => {
         if(res1){
             return stripe.charges.create(ob2)
         }
     })
     .then(res2 => {
         if(res2){
             return stripe.operation3(ob3)
         }
     })
     .then(res3 => {
         if(res3){
             // Success response
         }
     })
     .catch(err => {
         // Send error message accordingly
     });

如果需要更多的flex错误处理,你也可以为每个创建else,但是请仔细处理其他块。