我很好奇是否有一个很好的方法来处理快递4.0。
有时Stripe或我与Stripe的连接都需要解决。但是,我显然不希望用户知道这一点。我希望在安全地记录消息时显示消息'There was a problem completing your order, please contact support.'
,并提供一些信息供我处理。
我怀疑我可以在中间件中执行此操作。但是,我不确定如何。我想在它们发生时捕获这些错误并将它们转储到某种日志文件中(建议会很棒)所以我可以处理它。
有没有一种标准的方法可以做到这一点?我该如何做到这一点?
谢谢!
答案 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定义明确。