使用中间件和日志记录捕获条带错误

时间:2015-09-12 20:19:09

标签: node.js express stripe-payments

我很好奇是否有一个很好的方法来处理快递4.0。

有时Stripe或我与Stripe的连接都需要解决。但是,我显然不希望用户知道这一点。我希望在安全地记录消息时显示消息'There was a problem completing your order, please contact support.',并提供一些信息供我处理。

我怀疑我可以在中间件中执行此操作。但是,我不确定如何。我想在它们发生时捕获这些错误并将它们转储到某种日志文件中(建议会很棒)所以我可以处理它。

有没有一种标准的方法可以做到这一点?我该如何做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:0)

你以错误的方式思考这个问题。而不是暴露第三方错误,明确定义路由中的每个可能的故障情况。

// bad

app.use(function (err, req, res, next) {
  res.status(err.status).json({ error: err.message }) 
})

而是标记要曝光的错误:

app.use(function (err, req, res, next) {
  if (err.expose) {
    res.status(err.status).json({ code: err.code, error: err.message })
  } else {
    reportError(err, req)
    res.status(500).json({ code: "unknown", error: "unknown error" })
  }
})

你需要重新抛出实际的api错误。

function createError(status, message) {
  var err = new Error(message)
  err.expose = true
  err.status = status
  return err
}

function changeCard(user, data) {
  return postStripeCards(user, data)
  .catch({ type: "card_error" }, function (err) {
    throw createError(400, "invalid card")
  }) 
}

未捕获的错误是程序员错误,应报告并修复。任何通过它的东西都是一个错误。

function reportError (err, req) {
  // log error
  console.error(err.stack)

  // send to rollbar
  rollbar.handleError(err, req)

  // maybe send an email
  mailgun.send({
    from: "bot@myapp.com",
    to: "me@gmail.com",
    subject: "My App: " + err.message,
    text: err.stack + "\n\n" + JSON.stringify(req),
  })

  // pager duty, airbrake, etc
}

这需要工作,但这意味着您的API定义明确。