Включение клиента NodeJS для сервисов Google Maps в приложение NestJS

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

Основная цель этой статьи — предложить способ обернуть клиент NodeJS для сервисов Google Maps в модуль NestJS и использовать внедрение зависимостей, чтобы упростить его повторное использование в приложении. Хотя в этой статье используется именно пакет @googlemaps/google-maps-service-js npm, его можно использовать в качестве источника вдохновения для других внешних клиентских служб.

Фреймворк NestJS

NestJS — это платформа для создания масштабируемых и слабо связанных серверных приложений NodeJS. Одной из его основных характеристик является реализованная архитектура и структура каталогов, которые усиливают модульный характер приложения. Кроме того, NestJS полностью поддерживает TypeScript, а также работает с Express и Fastify под капотом, что делает его современной и жизнеспособной альтернативой для построения надежного веб-сервера с известными инструментами.

Архитектура фреймворка

Как указано в документации NestJS, его архитектура во многом вдохновлена ​​архитектурой Angular. Структура папок в основном организована в виде модулей, представляющих некую сущность, связывающую определенный контекст приложения. Каждый модуль обычно состоит из файлов app.module.ts, app.controller.ts и app.service.ts. Общая структура папок для модуля выглядит следующим образом:

google-maps
| — google-maps.controller.ts
| — google-maps.module.ts
| — google-maps.service.ts

Клиент Node.js для сервисов Google Maps

Клиент для службы карт Google — это библиотека, созданная для взаимодействия с веб-API, предоставляемым Google непосредственно из языка программирования данного проекта, в данном случае TypeScript с NodeJS.

Учитывая, что пакет @googlemaps/google-maps-service-js npm предоставляет множество периодически используемых методов и классов, один из способов использования внедрения зависимостей с этой службой — обернуть клиент службы карт Google внутри метода получения в классе модуля вместе с наиболее часто используемыми методами для лучшего обслуживания приложения. .

Оборачиваем библиотеку в модуль

Папка модуля google-maps состоит из файла module.ts и файла service.ts, который содержит геттер клиента и другие наиболее часто используемые методы. Тогда сервис будет выглядеть так:

Приведенный выше код состоит из следующих функций с использованием подхода ООП:

  • Класс GoogleMapsService расширяет класс Client по умолчанию и вызывает метод super() для создания его экземпляра, чтобы использовать все его методы и свойства;
  • Объявлено частное свойство для хранения ключа доступа, необходимого для доступа к службе google api;
  • AccessKey извлекается из переменной среды по соображениям безопасности с помощью встроенной службы NestJS ConfigService;
  • В этом примере определен асинхронный метод getCoordinates для получения значений широты и долготы с заданного адреса с использованием метода .geocode, который взаимодействует со своим родственным API веб-сервиса;
  • Учитывая, что приложение использует TypeScript, пакет также предоставляет пользовательские типы для библиотеки, поэтому можно определить тип возвращаемого значения для метода, созданного как LatLngLiteral.

Вся структура сервиса выше хорошо описана в его специальном разделе в документации NestJS.

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

Что касается файла модуля, то он отвечает за привязку всех файлов, связанных с данным контекстом, а также за внедрение в другие модули. Подробнее об этом разделе можно прочитать в Документации NestJS. google-maps.module.ts выглядит примерно так:

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

Внедрение зависимости

Наконец, необходимо, чтобы созданный модуль google-maps был объявлен внутри модуля, который использует службу google-maps, а затем использовал внедрение зависимостей в классе, который использует методы службы google-maps. Другие модули будут выглядеть так:

А затем для DI на уровне обслуживания:

В приведенном выше коде используется формат внедрения зависимостей NestJS для использования созданной службы google-maps, а также типы google-maps для определения возвращаемого значения метода getAddressCoords.

Заключение

Как обсуждалось ранее, интересно писать модульный код в масштабируемых приложениях с несколькими областями действия сущностей.

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