Код Middle HTTP-сервер, Express, NestJS спрашивают часто обновлено

Ошибки домена в HTTP-ответ (problem+json)

Условие

Напиши toHttpError(err, { exposeInternal = false } = {}): превращает объект ошибки в ответ { status, body }, где body в стиле RFC 9457 (problem details): { type, title, status, detail? , errors? }.

Ошибки приходят простыми объектами с полем code:

  • VALIDATION → 400, title Validation failed, errors из err.fields (как есть);
  • UNAUTHENTICATED → 401 Unauthorized; FORBIDDEN → 403 Forbidden;
  • NOT_FOUND → 404 Not found, detail из err.message;
  • CONFLICT → 409 Conflict, detail из err.message;
  • RATE_LIMIT → 429 Too many requests;
  • всё остальное → 500 Internal error; detail с err.message только если exposeInternal.

type всегда about:blank. Поля detail/errors не добавлять, если для них нет данных.

Примеры

toHttpError({"code":"NOT_FOUND","message":"User 7 not found"}) // {"status":404,"body":{"type":"about:blank","title":"Not found","status":404,"detail":"User 7 not found"}}
toHttpError({"code":"VALIDATION","fields":[{"path":"email","msg":"invalid"}]}) // {"status":400,"body":{"type":"about:blank","title":"Validation failed","status":400,"errors":[{"path":"email","msg":"invalid"}]}}
toHttpError({"code":"FORBIDDEN","message":"role user"}) // {"status":403,"body":{"type":"about:blank","title":"Forbidden","status":403}}

Как подойти

Подсказки: 2
  1. Таблица code → [status, title].
  2. Проверяй код через hasOwnProperty, а не map[err.code]: у объекта есть унаследованные ключи.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.