Перекрестная публикация ответа, который я дал на GitHub в https://github.com/strongloop/loopback-next/issues/1867#issuecomment-434247807
Построение ответов об ошибках HTTP - сложная задача.Легко ошибиться и открыть ваше приложение для атак.
В LoopBack (3.x и 4.x) мы используем наше промежуточное ПО strong-обработчик ошибок , чтобы позаботитьсяэтого.См. Обработка ошибок в наших документах.
Вот важные ограничения безопасности, о которых следует помнить:
В рабочем режиме strong-error-handler
пропускает детали из-за ошибкиответы для предотвращения утечки конфиденциальной информации:
- Для ошибок 5xx выходные данные содержат только код состояния и имя состояния из спецификации HTTP.
- Для ошибок 4xx выходные данные содержатполное сообщение об ошибке (
error.message
) и содержимое свойства details
(error.details
), которое ValidationError
обычно использует для предоставления машиночитаемых сведений о проблемах проверки.Он также включает error.code
, чтобы разрешить передачу машиночитаемого кода ошибки, который может быть использован, например, для перевода.
В режиме отладки strong-error-handler
возвращает полные трассировки стека ошибоки внутренние детали любых объектов ошибок клиенту в ответах HTTP.
Теперь, когда я вас предупредил, LoopBack 4 позволяет очень легко форматировать сообщения об ошибках по-своему.Просто предоставьте пользовательскую реализацию действия Sequence reject
.См. Настройка действий последовательности в наших документах, там объясняется, как создать пользовательское действие send
.Решение для reject
почти такое же, вам просто нужна другая сигнатура для функции действия.
export class CustomRejectProvider implements Provider<Reject> {
// ...
action({request, response}: HandlerContext, error: Error) {
// handle the error and send back the error response
// "response" is an Express Response object
}
}
Предупреждение: для некоторых ошибок, выдаваемых LB4, установлено только code
, эти ошибки нуждаются внемного предварительной обработки, чтобы решить, какой код статуса HTTP они должны вызвать.(Например, код ошибки ENTITY_NOT_FOUND
должен быть сопоставлен с кодом состояния 404
).Встроенное действие reject
еще не предоставляет эту предварительную обработку для использования пользовательскими действиями отклонения.С нашей стороны это упущение, я создал новый номер https://github.com/strongloop/loopback-next/issues/1942, чтобы отследить это.