Использование sentry с настраиваемым обработчиком ошибок в Express - PullRequest
0 голосов
/ 27 мая 2020

У меня запущен сервер 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}`))

Контроллеры на сервере делают запросы к базе данных, et c. поэтому они являются асинхронными c функциями - поэтому я использую функцию wrap, чтобы перехватывать отклонения обещаний и передавать их обработчику ошибок. Если я разверну контроллер, Sentry будет работать нормально, но тогда сервер никогда не отправит ошибку клиенту.

Я полагаю, что я, вероятно, ошибаюсь, поскольку это должно быть довольно просто, но неважно что я делаю Я не могу заставить работать Sentry + asyn c controllers + custom error handler. Любая помощь будет оценена.

(Это может быть проблема Express, если да, дайте мне знать, и я займусь этим)

Спасибо

1 Ответ

0 голосов
/ 28 мая 2020

По какой-то причине опция Sentry «Отфильтровать локальный хост» (которая была отключена, но каким-то образом была включена) фактически не отфильтровывает все локальные ошибки. Когда я удалил настраиваемый обработчик ошибок и функцию переноса, ошибкам удалось пройти через фильтр localhost. После того, как я снова выключил его, все ошибки прошли на Sentry fine.

...