У меня запущен сервер 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, если да, дайте мне знать, и я займусь этим)
Спасибо