Выполнение операций с базой данных с помощью серверной части Fastify
Express.js - это проверенный на практике фреймворк, который очень просто использовать. Несмотря на то, что Express является легким, часто требуется еще более быстрая серверная система. Это позволяет вашему приложению быть более быстрым и отзывчивым.
Именно здесь на помощь приходит Fastify. Это более эффективный и быстрый фреймворк, чем Express, благодаря меньшим накладным расходам. Это означает, что ваш сервер останется отзывчивым даже при работе с большими рабочими нагрузками. Фактически, по словам Сергея Онуфриенко, Fastify примерно на 20% быстрее Express.
Что он может предложить кроме скорости? Во-первых, у него есть растущая библиотека плагинов. Самое главное, у него есть система схем. Например, предположим, что у вас есть следующий ответ от вашего сервера:
Что, если вашему интерфейсу требуется только поле name
? Используя систему схем Fastify, вы можете установить фильтр и отправить поле name
в качестве ответа:
В этой статье вы узнаете, как создать API, используя MongoDB и Fastify в качестве серверной инфраструктуры.
Давайте начнем!
Начиная
Настройка проекта
Чтобы инициализировать приложение Node.js, выполните следующие команды терминала:
Теперь установим необходимые зависимости. Здесь нам нужны следующие пакеты:
dotenv
: использовать переменные среды.fastify
: Чтобы построить наш бэкэнд.fastify-mongodb
: плагин Fastify, который помогает нам взаимодействовать с нашей базой данных.mongodb
: чтобы мы могли анализировать параметры URL и преобразовывать их вObjectID
поля.
Чтобы получить эти модули, выполните следующую команду:
npm i dotenv fastify fastify-mongodb mongodb
Затем перейдите в свой .env
файл и вставьте строку подключения MongoDB следующим образом:
CONNECT_DB = connectionString
Когда это будет сделано, давайте обсудим структуру нашего проекта.
Каталог проекта
В структуре папок вашего проекта создайте следующие папки:
controllers
: Для хранения логики нашего приложения.routes
: В этом каталоге будут храниться наши маршруты и их соответствующие обработчики.
В итоге структура папок вашего проекта должна выглядеть так:
Создание нашего API
Домашний маршрут
В /index.js
напишите следующий код:
- Строка 1: Добавьте модуль
fastify
. Свойствоlogger
сообщает Fastify о необходимости выхода из пользовательских маршрутов и кодов ответов на терминал. - Строки 6–9: используйте плагин
fastify-mongodb
, чтобы мы могли использовать нашу базу данных в нашем проекте. - Строки 11-13: если пользователь переходит к маршруту
/
, отобразить ответ. - Строка 15: Запускаем наш бэкэнд на порт
8080
.
Давай проверим. Перейдите к своему клиенту API и сделайте запрос localhost:8080
.
Большой! Наш код работает.
Добавление пользователей в базу данных
В папке controllers
создайте файл с именем users.controller.js
. Здесь напишите следующий код:
- Строка 4: Получить коллекцию
users
из базы данных. - Строка 5: перечислите всех пользователей в базе данных и поместите их в массив.
- Строка 7: В конце отправляем результат клиенту.
- Строка 13: Сохраните поля
name
иage
из полезной нагрузки и сохраните их в объектеdata
. - Строки 14 и 15: Наконец, сохраните эти данные в базе данных и отправьте этот элемент клиенту.
Теперь мы написали нашу логику. В качестве второго шага давайте теперь зарегистрируем его как обработчик.
В routes
создайте файл с именем users.js
. Здесь напишите следующий код:
- Строка 4: Если пользователь переходит на маршрут
/users
, запустите функциюlistUser
. - Строка 5: Когда пользователь отправляет данные по маршруту
/users
(запросPOST
), вызовите методaddUser
.
Мы почти закончили! Осталось только зарегистрировать /users
маршрут.
Для этого перейдите к /index.js
и напишите эту строку:
fastify.register(require("./routes/users"));
Чтобы проверить свой код, выполните POST
запрос к /users
маршруту:
Чтобы получить все документы в коллекции users
, используйте запрос GET
:
Это было действительно просто!
В итоге /index.js
должен выглядеть так:
Чтение пользователей из базы данных
В controllers/users.controller.js
добавьте следующий код:
- Строка 4: Найдите пользователя с конкретным полем
id
. Объектreq.params
содержит параметры URL. В этом случае нам нужен только параметрid
. - Строки 5-7: если он существует, вернуть результат.
- Строка 8: В противном случае сообщите клиенту, что этого пользователя не существует.
В качестве последнего шага мы должны зарегистрировать эту функцию в нашем users
маршруте. Перейдите к routes/users.js
и добавьте следующую строку в функцию routes
:
fastify.get("/users/:id", getUser);
Это будет вывод:
В следующем разделе вы узнаете, как обновлять пользователей в базе данных.
Обновленный /routes/user.js
должен выглядеть так:
Обновление пользователей
Перейдите к /controllers/users.controller.js
и добавьте следующий блок:
- Строки 10–14: Найдите пользователя с совпадающим
id
и обновите его в соответствии с полезной нагрузкой. - Строка 15: В конце отправьте сообщение клиенту, указывающее, что процесс был успешным.
На втором этапе перейдите к routes/users.js
и добавьте следующую строку:
fastify.put("/users/:id", updateUser);
Это означает, что если пользователь выполняет PUT
запрос к users/:id
, Fastify вызовет метод updateUser
.
Запустите код. Это будет вывод:
В следующем разделе вы напишете код для реализации функции удаления.
Удаление пользователей
Напишите следующий код в users.controllers.js
:
- Строка 4: Найдите пользователя с совпадающим полем
id
. Если найден, удалите этот документ из базы данных. - Строка 6: Если сервер не может найти конкретную запись, сообщите об этом клиенту.
Нам остается только зарегистрировать это как обработчик. Для этого перейдите к routes/users.js
и добавьте следующую строку:
fastify.delete("/users/:id", deleteUser);
Это будет вывод:
На этом мы закончили с этим разделом. В следующем разделе вы создадите схему для этого API.
В итоге routes/users.js
должен выглядеть так:
Создание схем
Каждый раз, когда мы делаем запрос к /users
, мы получаем все поля каждого пользователя:
В этой статье мы построим схему, которая скажет Fastify исключить поле age
.
В свой routes/users.js
файл добавьте следующий блок кода:
Давайте разберем этот код по частям:
- Строка 4: Если код ответа
200
(успешный ответ), возвращаемый результат должен бытьarray
. - Строка 6: Каждый элемент этого массива будет иметь тип
object
. - Строки 8-10: Каждый объект будет иметь два поля:
_id
иname
. - Строка 16: Маршрут, использующий эту схему, будет иметь метод
listUsers
в качестве обработчика. - Строка 20: Наконец, сообщите Fastify, что маршрут
/users
будет использовать схемуgetUsersopts
.
Запустите код.
Наш код работает! Наш сервер вернул меньший объем данных. Это означает, что размер нашего запроса также уменьшился.
Давайте теперь напишем схему, когда пользователь ищет элемент, используя id
.
В users/routes.js
добавьте этот фрагмент кода:
- Строки 4–10. При ответе с кодом
200
отправьте поля элемента_id
,name
иage
. - Строка 18: Используйте схему
getUserOpts
для поля/users/:id
.
Вот и все! Это будет вывод:
Мы даже можем использовать схему для полезной нагрузки запроса. Чтобы продемонстрировать это, мы закодируем схему, которая будет обрабатывать PUT
запрос на /users/:id
.
- Строка 4: тело запроса должно быть типа
object
. - Строка 5: Нашему серверу требуются поля
name
иage
. Если какой-либо из них отсутствует, запрос не будет выполнен. - Строка 7:
name
должен быть типаstring
, аage
должен бытьinteger
.
Давай проверим. Выполните неверный PUT
запрос к Fastify следующим образом:
Запрос будет выполнен только в том случае, если мы укажем все обязательные поля:
Удивительный! Давайте теперь материализуем схему для нашего POST
запроса. Добавьте следующий код:
- Строка 26: Используйте схему
postUserOpts
на маршруте/users
.
Нам остается только разработать схему для нашего DELETE
запроса.
- Строка 5: возвращаемый результат должен иметь тип
string
.
Это должен быть вывод кода:
Готово!
Дополнительные ресурсы
- Как создать невероятно быстрый REST APis с помощью Mongoose и Fastify - Зигфрид Гримбек
- Ускоренный курс - Traversy Media
- Забудьте об экспрессе. Вместо этого выберите эти альтернативы - LogRocket
Заключение
Если вы стремитесь создать API, способствующий отзывчивости и скорости, тогда Fastify удовлетворит ваши потребности. Более того, его обширная экосистема плагинов позволяет разрабатывать сложные функции без написания большого количества кода.
Большое спасибо за чтение!