Быстрый шаг вперед с конфигурацией среды NestJS

Вы, вероятно, потратили некоторое время на работу с замечательной инфраструктурой NestJS, и теперь пришло время узнать, как получить некоторые внешние значения для ваших параметров конфигурации, таких как некоторые ключевые или глобальные переменные, например:

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

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

NB: Предполагается, что вы уже установили пакет @nestjs/config для своего проекта, а также хорошо, если вы также установили пакет @nestjs/jwt и начали работать с JSON Web Tokens.

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

Основы

Файл конфигурации .env.dev environment с определенными свойствами и их значениями (например, парами ключ/значение).

.env.dev:

Скрипты в файле package.json

Например, мы можем запустить конфигурацию dev в нашем терминале:

npm run start:dev

Глобальная настройка ConfigModule в AppModule

.forRoot() — Этот статический метод загружает переменные среды в ConfigModule, настраивает поставщика ConfigService и делает его общемодульным, а поскольку это AppModule, он делает его доступным для всего приложения.

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

envFilePath — мы используем свойство envFilePath для загрузки переменных среды из файла — мы передаем полное имя файла, содержащего их.

Теперь пришло время использовать внешние значения (через ConfigModule) в нашем проекте.

Использование ConfigService в классе/репозитории/сервисе

Во-первых, мы должны добавить его в массив свойств импорта Module, к которому принадлежит этот класс/свойство/сервис.

imports: [AuthModule, ConfigModule],

Импорт ConfigModule в UsersModule

Обратите внимание, что в нашем случае мы уже установили ConfigModule для глобального использования в нашем AppModule (т. е. мы установили для свойства isGlobal значение true), и поэтому нет необходимости импортировать ConfigModule в массив свойств imports.

Затем мы должны внедрить его в конструктор этого класса/репозитория/сервиса:

И, наконец, мы можем использовать его «обычно»:

Использование ConfigService в main.ts

Поскольку main.ts содержит только функцию bootstrap(), мы можем получить экземпляр/контекст ConfigService как константу, например:

const configService = app.get(ConfigService);

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

const appPort = configService.get<number>('APP_PORT', 3000);
await app.listen(appPort);

Как вы можете видеть (и как указано в официальной документации), «метод get() также принимает необязательный второй аргумент, определяющий значение по умолчанию, которое будет возвращено, когда ключ не существует, как показано» выше для прослушивающего порта приложения, для значение по умолчанию равно 3000.

То же самое мы можем сделать для любого другого ключа, объявленного в файле окружения.

Пример файла main.ts:

Внедрение и использование ConfigService в динамически импортируемом модуле

(что он импортируется в массив свойств импорта модуля)

Это, например, тот случай, когда мы импортируем JwtModule в другой модуль, например. в модуле Authorization: AuthModule. Ниже показано, как мы можем импортировать JwtModule и напрямую зарегистрировать значения его параметров/свойств: секрет и expiresIn в signOptions.

Первый совет здесь - зарегистрировать JwtModule асинхронно, например.

JwtModule.registerAsync(. . .)

Это необходимо, потому что мы должны асинхронно читать внешние файлы, такие как файлы .env.

Затем мы должны добавить ConfigModule в массив свойств вставки. После этого мы можем предоставить/внедрить экземпляр ConfigService динамически (и асинхронно), используя useFactory().

Пример полной версии AuthModule:

Опять же, здесь нет необходимости также объявлять ConfigModule в массиве свойств модулей, поскольку мы уже установили isGlobal: true в AppModule.

Вот и все! Спасибо за чтение и удачного кодирования!