首页 > 解决方案 > 在 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 问题,如果是这样,请告诉我,我会在那里处理)

谢谢

标签: node.jsexpresssentry

解决方案


由于某种原因,Sentry 的“过滤掉本地主机”选项(已关闭但不知何故被打开)实际上并没有过滤掉所有本地错误。当我删除自定义错误处理程序和包装函数时,错误设法通过了 localhost 过滤器。在我将其关闭后,所有错误都在 Sentry 上出现。


推荐阅读