Включение клиента 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
.
Заключение
Как обсуждалось ранее, интересно писать модульный код в масштабируемых приложениях с несколькими областями действия сущностей.
Принимая во внимание описанный сценарий, приложение, представленное в этой статье, демонстрирует способ модульности внешних служб, делая код более пригодным для повторного использования и концентрируя методы и значения, связанные с контекстом, в одном модуле.