В настоящее время API-интерфейсы повсюду, нравится вам это или нет, и если вы инженер-программист, вы не можете избежать REST API, насколько это невероятно распространено.

Если вы решите создать еще один API в Node.js, вы можете столкнуться с дилеммой ... какую среду HTTP мне следует использовать? Есть множество вариантов, включая самые популярные, такие как express, koa, loopback… и NestJS.

NestJS - это фреймворк для построения серверных приложений Node.js. Он поставляется с множеством отличных инструментов, многие из которых были вдохновлены Angular, такие как модули, службы, внедрение зависимостей, CLI, каналы и многое другое. По умолчанию он использует TypeScript, однако при желании вы можете использовать VanillaJS.

Сегодня я хотел бы представить простой пример чистого REST API для управления книгами. Позвольте мне показать вам, как это красиво организовано с небольшой помощью модуля CQRS от NestJS.

Щелкните здесь, чтобы перейти к репозиторию Github.

Сначала мы взглянем на общую структуру, а затем разберем ее шаг за шагом.

Main.ts - этот файл отвечает за создание приложения NestJS из AppModule.

App.module - ядро ​​проекта, сюда мы импортируем модули, которые предоставляют функциональные возможности.

Books.module - этот модуль будет импортирован AppModule, чтобы предоставить все, что связано с нашими книгами.

Books.controller - здесь мы объявляем наши конечные точки со всеми параметрами.

Entities - здесь мы объявляем наш класс Book.

DTO - объект передачи данных - связка интерфейсов для связи с приложением.

Репозиторий, Запрос, Команды - эти папки относятся к CQRS, мы рассмотрим их чуть позже.

Наконец, перейдем к коду!

Мой план - показать вам весь поток запросов. Начнем с модуля.

КнигиМодуль

Здесь мы можем увидеть весь импорт для этого модуля, контроллеров и поставщиков.
Если мы внимательно посмотрим на поставщика, мы увидим, что в этом модуле мы предоставляем IdGenerator, который является абстрактным классом, и мы предоставляем его. с классом UuidGenerator.

Такой подход позволяет нам создать несколько адаптеров, а затем предоставить их. Одно из самых больших преимуществ этого подхода - разделение кода. Предположим, мы хотим изменить UuidGenerator на наш собственный генератор, как мы можем это сделать? Просто реализуйте класс, который расширит IdGenerator, предоставит его в модуле, и все!

С этого момента все, что объявлено в области действия этого модуля, который попытается использовать внедренный IdGenerator, фактически использует его вместо класса UuidGenerator.

BooksController

Вот и наши конечные точки. Обсудим интересные части.

Декоратор
С помощью декораторов мы можем легко объявить маршрут, метод и параметры. Его очень просто читать и настраивать.

Внедрение зависимостей в конструктор
Мощная функция, встроенная в NestJS! С помощью этого механизма мы можем внедрить зависимость в класс, и нам не нужно создавать экземпляр внедренной зависимости, мы позволим NestJS сделать это за нас! Здесь мы будем использовать его для внедрения commandBus и queryBus. И чтобы это объяснить, мы перейдем к…

CQRS

CQRS означает разделение ответственности за запросы команд и позволяет лучше масштабировать приложение, обрабатывать сложную бизнес-логику и лучше обрабатывать логику проекта в более крупных командах. Конечно, в этом проекте это можно было бы легко пропустить, однако я хочу показать, насколько легко это можно реализовать с помощью NestJS.

Давайте посмотрим на поток простого запроса GetBookQuery. Во-первых, мы должны вызвать его из контроллера книги в queryBus, предоставляемом реализацией NestJS CSQR:

Затем обработчик запроса берет на себя управление.

Теперь мы будем использовать внедренный BookRepository для извлечения данных и все. Давайте подробнее рассмотрим BookRepository:

Мы видим, что это просто чистый абстрактный класс, и он предоставляется в модуле, чтобы сделать вашу реализацию максимально гибкой. Если вы прокрутите вверх, вы увидите, что класс BookRepository предоставляется с BookRepositoryMemoryAdapter:

Здесь, только для разработки, мы можем использовать некоторую фиктивную реализацию нашего хранилища, а позже решить, какая база данных подходит нам лучше всего.

Подводя итог, некоторые люди скажут, что все это всего лишь дополнительный код для простого приложения. Но если вы подумаете об этом на минуту, вы заметите, что этот подход фактически применяет хорошие практики в вашей архитектуре.

Надеюсь, вы нашли здесь что-то интересное и, возможно, в следующий раз попробуете NestJS!