Библиотека Fastest для запуска в fastest API: AWS HTTP API
Говорят, что одна из самых известных цитат всех времен принадлежит президенту и государственному деятелю Бенджамину Франклину: «Время — деньги». И я искренне считаю, что в наши дни эта цитата актуальна как никогда. Хотя сегодня большинство языков программирования довольно быстрые, мы стремимся найти тот, который немного быстрее. То же самое можно сказать и о библиотеках JavaScript. И сегодня я собираюсь помочь вам познакомиться с библиотекой, которая претендует на звание самой быстрой из них, даже имеет fast в названии «FASTify». Так что это должно быть правдой.
Почему Фастфайф?
Fastify — это веб-фреймворк, ориентированный на обеспечение наилучшего опыта разработчиков с наименьшими накладными расходами и мощной архитектурой плагинов. Он вдохновлен Hapi и Express, и, насколько нам известно, это один из самых быстрых веб-фреймворков в городе. (https://www.fastify.io/)
Чтобы проверить это утверждение, я попаду в суровые условия, где каждая миллисекунда имеет значение. Да, я использую эту библиотеку для создания приложения REST и развертывания AWS Lambda.
Чтобы получить максимальную отдачу от скорости, нам нужен быстрый API, такой как самый быстрый в AWS: HTTP API. В 2020 году AWS анонсировала новый шлюз HTTP API в качестве преемника чрезвычайно популярных API REST. По сути, HTTP API позволил сократить задержку и снизить затраты.
API-интерфейсы HTTP предназначены для экономически эффективной интеграции с сервисами AWS, включая AWS Lambda, и конечными точками HTTP с малой задержкой. API-интерфейсы HTTP поддерживают авторизацию OIDC и OAuth 2.0, а также имеют встроенную поддержку CORS и автоматического развертывания. REST API предыдущего поколения в настоящее время предлагают больше функций. (docs.aws.amazon.com)
Несколько заметных недостающих функций:
- Кэширование API
- Преобразование тела запроса
- Проверка запроса/ответа
- Тестовый вызов
- Edge-оптимизированный
- Рентген AWS
Сравнение Fastify с Express
ExpressJS на сегодняшний день является наиболее используемой средой в экосистеме NodeJS. Я предполагаю, что вы знакомы с Express, но если вам нужно освежить знания, вы можете проверить мой другой учебник, в котором я рассказываю об ExpressJS (здесь)
Ниже вы можете просмотреть структуру базовой обработки запросов. Я закомментировал некоторые части, чтобы сделать TypeScript счастливым. Выглядит знакомо?
В то время как в ExpressJS почти все является промежуточным ПО, в Fastify все является плагином.
Хотя мы можем использовать его как замену ExpressJS, есть несколько отличий. С самого начала вы можете видеть, что Fastify отлично поддерживает async/await даже в обработчиках маршрутов. Кроме того, Fastify был создан с использованием TypeScript, поэтому пользователи, использующие его с TS, могут получить отличный опыт.
Более тонкое отличие заключается в том, что в Fastify ответ называется ответом.
Заметным отличием является то, что вместо использования промежуточного ПО для получения релевантных данных Fastify использует ловушки, и с их помощью вы можете напрямую взаимодействовать с жизненным циклом Fastify. Существуют хуки запроса/ответа и хуки приложений:
- "по запросу"
- препарсинг
- предвалидация
- предобработчик
Для проверки и сериализации Fastify рекомендует использовать схему JSON.
Схема JSON – это словарь, позволяющий аннотировать и проверять документы JSON. (https://json-schema.org/)
Преимущества:
- Описывает существующие форматы данных.
- Предоставляет четкую документацию, удобочитаемую человеком и машиной.
- Проверяет данные, которые полезны для.
- Автоматизированное тестирование.
- Обеспечение качества предоставляемых клиентом данных.
По сути, использование JSON-схемы повышает безопасность и значительно ускоряет десериализацию/анализ запросов и повторов.

Создание приложения
Давайте создадим приложение. Быстрый.
Чтобы быстро приступить к работе, мы установим fastify-cli, а затем создадим проект приложения fastify-lambda. Наконец, нам нужно установить зависимости.
npm i fastify-cli fastify generate --lang=ts fastify-lambda cd fastify-lambda npm install
Маршруты
В каталоге проекта мы видим маршрут example в уже определенной папке маршрутов. CLI Fastify использует подключаемый модуль fastify-autoload для автоматической настройки маршрутов, соответствующих структуре папок. Так же, как и другой отличный фреймворк, но для внешнего интерфейса, NextJS, если мы создадим новую папку с именем api, и в ней у нас будет еще одна папка с именем users, маршрут будет api/users .

Модели
Мы можем работать как экспресс-приложение, и оно будет работать, но мы упустим все функции, которые делают Fastify великолепным. Как я упоминал ранее, нам нужно предоставить схему JSON для воспроизведения и ответа. Давайте сделаем пример с пользовательской моделью.
Это всего лишь пример, но вы можете видеть, что вам нужно указать множество свойств, а также вам нужно создать модель машинописного текста. Но не бойтесь, для нас есть плагин, который делает большую часть работы. Подключаемый модуль называется json-schema-to-ts, который создает модель машинописного текста из схемы.
Совет важен для экспорта as const;
Чтобы получить модель машинописного текста, мы можем просто написать:
type User = FromSchema<typeof userSchema>;
И теперь мы можем использовать его в нашем контроллере, заменив типы нашей новой userSchema.
Ниже приведен небольшой почтовый запрос, в котором вы можете видеть, что Body имеет тип User. А поскольку мы добавили схему типа запроса, мы получаем интеллектуальные предложения, когда деструктурируем тело.
Весь код доступен на моем GitHub для последующего просмотра здесь.
Наконец, несколько основных команд, которые помогут вам начать работу с Fastify:
- npm run dev //запускает локальную среду разработки
- npm run start //запускает сервер для prod
Модель бессерверных приложений AWS
Модель бессерверных приложений AWS (SAM) — это платформа с открытым исходным кодом для создания бессерверных приложений. Это позволяет вам написать небольшой файл YAML для описания функции и конечных точек. А также с помощью простой команды приложение развертывается на AWS Lambda и настраивается все необходимое для установки.
Дополнительные подробные руководства по SAM вы можете найти в моем посте здесь.
Базовый SAM хвалит:
sam buildsam deployдля развертывания приложения в облакеsam validateпроверить файл конфигурацииsam deleteчтобы удалить приложение из Lambda
Или, если вы просто хотите начать с нуля и использовать предопределенные шаблоны AWS SAM, используйте следующую команду: sam init
В основном базовая конфигурация показана ниже:
Я использую новый HTTP Api, чтобы добиться максимальной производительности, а также упаковываю приложение в формат ZIP.
Необязательный шаг. Давайте создадим раскрученный S3:
aws s3api create-bucket --bucket my-bucket-<Random> --region <region> --create-bucket-configuration LocationConstraint=<region>
** Совет: добавьте несколько случайных символов в имя, потому что оно должно быть уникальным во всем s3. И указать регион. И поместите имя в samconfig.toml.
Иногда samconfig не генерируется, поэтому вы должны написать его вручную, ниже приведен пример, и заменить имя региона и добавить идентификатор корзины.
Преобразование приложения в Lambda
Чтобы получить события и все данные из шлюза AWS в нашем приложении, нам нужен дополнительный уровень. К счастью, нам не нужно писать его с нуля, потому что для этой цели есть библиотека. Он называется aws-lambda-fastify. Давайте установим его и будем использовать.
npm i aws-lambda-fastify
Теперь нам нужно обернуть наше приложение библиотекой.
Развернуть
Только еще один шаг и может иметь полное развертывание. AWS SAM знает, что это приложение NodeJS и как его создавать, но мы также используем Typescript, поэтому сначала необходимо скомпилировать проект. Для выполнения этой задачи мы можем добавить в package.json в postinstall вызов функции для компиляции проекта с использованием Typescript. Кроме того, TypeScript необходимо добавить в производственные зависимости.
Полный файл package.json показан ниже:
Поздравляем, мы сделали это. Теперь все, что нам нужно сделать, это создать приложение и развернуть его с помощью интерфейса командной строки SAM:
sam build sam deploy
Пока что приложение работает довольно быстро, но ненамного по сравнению с моим предыдущим приложением, использующим Express.
Полный код можно найти на GitHub здесь. Там вы также можете найти файлы Docker для Lambda, наслаждайтесь!
Если вам интересно больше уроков, пожалуйста, подпишитесь и хлопните в ладоши!
Вспомогательные ссылки:
Руководство по настройке AWS CLI: здесь
Руководство по AWS SAM здесь
Руководство по созданию корзины S3 здесь