Я занимаюсь разработкой экспресс-приложения, и после того, как я укажу все свои маршруты и промежуточное ПО, у меня это будет в конце server.js:
// Log errors
app.use(function (err, req, res, next) {
logger.error(err.stack);
if(process.env.NODE_ENV === 'production')
return res.status(500).send('Something broke!');
next(err);
});
// Start server
app.listen(port, () => {
logger.info('Server is up on port ' + port);
});
Цель этого состоит в том, чтобы отследить ВСЕ ошибки на производстве и избежать утечки конфиденциальных данных клиенту.
У меня есть этот код в одном из моих контроллеров:
const createHTTPError = require('http-errors')
async function(req, res, next) {
try {
invoice = await Invoice.create({
// data
});
}catch (e) {
if(e instanceof Sequelize.ValidationError){
logger.error(e);
return next(createHTTPError(400, 'Validation did not pass: ' + e.message));
}
}
}
Проблема в том, что когда next()
вызывается с http-errors
объектом, он всплывает до моего обработчика ошибок, но информация теряется, и внутри него объект err является простым Error
экземпляром с этими параметрами :
message = "Validation did not pass: notNull Violation: invoice.clientEmail cannot be null"
name = "BadRequestError"
stack = "BadRequestError: Validation did not pass: notNull Violation: invoice.clientEmail cannot be null\n at module.exports (/home/XXXX/create-new-invoice.js:109:33)"
Код ошибки потерян. Тип объекта ошибки потерян (ну, преобразован в строку в имени).
Что мне делать? Если я уберу свою ловушку, я рискую получить утечку конфиденциальной информации. Спасибо