Выполнение операций с базой данных с помощью серверной части 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.

Это должен быть вывод кода:

Готово!

Дополнительные ресурсы

Код этого проекта на GitHub.

Заключение

Если вы стремитесь создать API, способствующий отзывчивости и скорости, тогда Fastify удовлетворит ваши потребности. Более того, его обширная экосистема плагинов позволяет разрабатывать сложные функции без написания большого количества кода.

Большое спасибо за чтение!