Как добавить пользовательский параметр в объекте ошибки lb4? - PullRequest
0 голосов
/ 02 мая 2019

Я использую strongloop 4 (фунт 4).Я сталкиваюсь с одной проблемой, что в объекте ошибки мне нужен еще один пользовательский параметр в объекте ошибки.

Я хочу его на глобальном уровне.При каждой ошибке я хочу добавить этот пользовательский параметр в каждое сообщение об ошибке.

В loopback4 глобальная обработка ошибок выполняется с помощью src / sequence.ts .

Предположим, чтообъект сообщения об ошибке:.

{
  "error": {
    "statusCode": 400,
    "name": "xyz",
    "message": "firstName is required"
  }
}

Я хочу вывод объекта ошибки как.

{
  "error": {
    "customParam" : "customParam",
    "statusCode": 400,
    "name": "xyz",
    "message": "firstName is required"
  }
}

1 Ответ

1 голос
/ 10 мая 2019

Перекрестная публикация ответа, который я дал на 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, чтобы отследить это.

...