JS: REST API (Fastify)
Теория: Валидация данных запроса и ответа
OpenAPI спецификация содержит описание структур данных в свойстве components в виде JSON Schema. Она описывает структуру входных и выходных данных включая: имена полей и их обязательность, типы полей и правила валидации.
JSON Schema позволяет реализовать несколько полезных вещей:
- Получить готовые структуры, например классы и интерфейсы в языках где они поддерживаются, например в TypeScript. Это дает поддержку редактора для автокомплита и подсветки ошибок.
- Автоматизировать процесс проверки входных и выходных данных в рантайме, с возвратом нужного кода ответа.
Валидация в Fastify
Fastify поддерживает валидацию на базе JSON Schema из коробки. Поддерживаемые валидации включают:
- body: Тело запроса.
- querystring: Строка запроса.
- params: Параметры запроса, например /users/ (id параметр).
- headers: Заголовки запроса.
- response: Тело ответа с учетом разных кодов и форматов.
Пример:
Fastify не только сверяет совпадение по структуре и типами, но так же выполняет преобразования типов. По умолчанию все входящие данные являются строкой, но если, например, в схеме указано, что параметр page это число, то значение этого параметра будет преобразовано в число. Ручных преобразований при таком подходе не будет вообще.
Когда структуры не совпадают, то Fastify автоматически обрабатывает ошибки, возвращая код 400.
Валидация на базе OpenAPI
Благодаря подходу API First, у нас уже есть все необходимые схемы в файле openapi.json, сгенерированным TypeSpec. В теории мы могли бы прочитать этот файл внутри Fastify и передать схемы в каждый обработчик. На практике, это будет неудобно из-за указания на связи $ref, которые автоматически не раскрываются. Придется много делать много дополнительных движений.
Но есть и более серьезная проблема. При использовании TypeScript, передача схем напрямую не формирует нужные типы. Это значит, что работая внутри обработчика мы постоянно будем натыкаться на ошибки при обращении к полям входных данных о том, что они не существуют. Эта проблема актуальна и для JavaScript.
TypeBox
Чтобы добиться нужного эффекта с преобразованием схемы в типы, нужно добавить в процесс новый элемент, который называется TypeBox. Эта библиотека представляет собой язык описания JSON Schema на JavaScript/TypeScript.
Но работать с ней напрямую нам не нужно. Процесс будет выглядеть так:
- Указываем Fastify, что мы работаем не с JSON Schema, а TypeBox.
- С помощью библиотеки генерируем TypeBox схему на основе OpenAPI спецификации.
- Подключаем TypeBox схему к обработчикам, вместо прямого описания JSON Schema
Установка и настройка
-
Установим пакеты для совместной работы Fastify и Typebox
-
Укажем Fastify на необходимость использовать TypeBox. Внутри файла app.js поменяем объект
fastifyна объектapiи заменим использование одного на другой
Генерация схемы
Схема генерируется командой openapi-box:
Результирующий файл называется schema.js и располагается в корне проекта. Внутри него описано множество подобных определений:
Для удобства имеет смысл объединить команды компиляции tsp и генерации схемы openapi-box в одну команду, например с помощью Makefile:
В таком случае для генерации всех нужных файлов будет достаточно набрать make types:
Использование схемы
Для подключения готовой схемы, ее нужно импортировать в нужный файл с маршрутами и добавить в обработчики.
Импортируемый объект из файла schema.js имеет следующую структуру:
К этой схеме нужно привыкнуть. Запоминать ее не нужно, проще всего она отрабатывается на практических примерах, в идеале через подсказки редактора, как это происходит с нашим примером на Github.
Рекомендуемые программы
Завершено
0 / 15
