node.js - 在 Express 中使用 sentry 和自定义错误处理程序
问题描述
我有一个 Express 服务器在成功实施 Sentry (v5.15.5) 的网站后端运行。我现在正在尝试改进后端的错误处理,因为目前如果请求出现问题,请求不会结束并且客户端坐在那里等待响应,它永远不会得到。为了告诉客户请求是否失败,我在文档中使用了自定义错误处理程序:
app.use(function onError(err, req, res, next) {
// The error id is attached to `res.sentry` to be returned
// and optionally displayed to the user for support.
res.statusCode = 500;
res.end(res.sentry + "\n");
});
但是,当我在我的服务器上使用它时,只有自定义错误处理程序运行 - Sentry 永远不会为错误创建事件,但如果我只使用另一个自定义错误函数,它们都会被正常调用,这让我认为这是一个 Sentry问题。这是服务器代码的相关部分:
...
const Sentry = require('@sentry/node');
...
const app = express()
Sentry.init({ dsn: process.env.SENTRY });
...
// Middlewares
app.use(Sentry.Handlers.requestHandler());
app.use(express.json())
app.use(helmet())
app.use(cors())
app.use(morgan('tiny'))
const controllers = require('./controllers')
const wrap = fn => (...args) => Promise
.resolve(fn(...args))
.catch(args[2])
// Routes
...
app.post('/test', authUser, wrap(controllers.testController))
...
app.use(Sentry.Handlers.errorHandler());
app.use(function onError(err, req, res, next) {
res.statusCode = 500
res.end(res.sentry + "\n")
})
app.listen(PORT, () => console.log(`APP RUNNING ON PORT ${PORT}`))
服务器上的控制器发出数据库请求等,因此它们是异步函数 - 这就是为什么我使用该wrap
函数来捕获承诺拒绝并将它们传递给错误处理程序。如果我打开控制器,那么 Sentry 工作正常,但是服务器永远不会将错误发送给客户端。
我希望我可能会遇到这个错误,因为它应该很简单,但无论我做什么,我都无法让 Sentry + 异步控制器 + 自定义错误处理程序工作。任何帮助,将不胜感激。
(这可能是 Express 问题,如果是这样,请告诉我,我会在那里处理)
谢谢
解决方案
由于某种原因,Sentry 的“过滤掉本地主机”选项(已关闭但不知何故被打开)实际上并没有过滤掉所有本地错误。当我删除自定义错误处理程序和包装函数时,错误设法通过了 localhost 过滤器。在我将其关闭后,所有错误都在 Sentry 上出现。