e22m4u 3 недель назад
Родитель
Сommit
ee25f1eeaa
1 измененных файлов с 67 добавлено и 0 удалено
  1. 67 0
      README.md

+ 67 - 0
README.md

@@ -26,6 +26,7 @@ HTTP маршрутизатор для Node.js на основе
   - [Метаданные маршрута](#метаданные-маршрута)
   - [Метаданные маршрута](#метаданные-маршрута)
   - [Состояние запроса](#состояние-запроса)
   - [Состояние запроса](#состояние-запроса)
   - [Ветвление маршрутов](#ветвление-маршрутов)
   - [Ветвление маршрутов](#ветвление-маршрутов)
+  - [Обработка ошибок](#обработка-ошибок)
 - [Отладка](#отладка)
 - [Отладка](#отладка)
 - [Тестирование](#тестирование)
 - [Тестирование](#тестирование)
 - [Лицензия](#лицензия)
 - [Лицензия](#лицензия)
@@ -410,6 +411,72 @@ v1Branch.defineRoute({
 // GET /api/v1/status
 // GET /api/v1/status
 ```
 ```
 
 
+## Обработка ошибок
+
+Маршрутизатор автоматически перехватывает любые ошибки, выброшенные из хуков
+или обработчика маршрута. По умолчанию, любая ошибка приводит к ответу сервера
+со статусом *500 Internal Server Error*.
+
+Для более гибкого управления HTTP-статусами рекомендуется использовать
+библиотеку [http-errors](https://www.npmjs.com/package/http-errors).
+Стандартный обработчик ошибок спроектирован для работы с данной библиотекой
+и автоматически извлекает `statusCode`, `message` и другие полезные свойства
+ошибки.
+
+```js
+import HttpErrors from 'http-errors';
+
+router.defineRoute({
+  method: HttpMethod.GET,
+  path: '/users/:id',
+  handler(ctx) {
+    const {id} = ctx.params;
+    const user = findUserById(id); // логика поиска пользователя
+    if (!user) {
+      // выброс ошибки 404 Not Found
+      // маршрутизатор поймает ошибку и отправит JSON-ответ
+      throw new HttpErrors.NotFound('Пользователь не найден');
+    }
+    if (!hasAccess(ctx.state.currentUser, user)) {
+      // ошибка 403 Forbidden с дополнительными данными
+      const error = new HttpErrors.Forbidden('Доступ запрещен');
+      error.code = 'ACCESS_DENIED';
+      error.details = {reason: 'Недостаточно прав'};
+      throw error;
+    }
+    return user;
+  },
+});
+```
+
+Структура ответа будет зависеть от данных, содержащихся в объекте ошибки.
+Например, ошибка `HttpErrors.NotFound` приведет к ответу со статусом `404`
+и телом, содержащим указанное сообщение.
+
+```json
+{
+  "error": {
+    "message": "Пользователь не найден"
+  }
+}
+```
+
+Если объект ошибки содержит дополнительные поля (например, `details`
+или `code`), они автоматически включаются в ответ. Это позволяет
+передавать клиенту более детальную информацию.
+
+```json
+{
+  "error": {
+    "code": "ACCESS_DENIED",
+    "message": "Доступ запрещен",
+    "details": {
+      "reason": "Недостаточно прав"
+    }
+  }
+}
+```
+
 ## Отладка
 ## Отладка
 
 
 Установка переменной `DEBUG` включает вывод логов.
 Установка переменной `DEBUG` включает вывод логов.