[NestJS] Информация о конфигурации и переменные среды

NestJS

существуетNestJSРекомендуется для использования в проектахnestjs-configмодуль, чтобы получить конфигурацию.

nestjs-configПредоставляет функцию config.get() для чтения конфигураций с помощью config.get('app.host').

nestjs-configадрес:GitHub.com/nestJS-ком…

Лучшие практики

получить конфигурацию

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

  1. Жесткий код, прямо написанный до смерти. - ❌ Низкая ремонтопригодность
  2. Жестко закодирован в файлах ts, таких как config/app.ts. - ❌ Невозможность различать среды для настройки
  3. Прочтите файл .env напрямую. - ❌ Хотя проблема с переменной окружения решена, не рекомендуется
  4. Переменные среды хранятся в .env, а информация о конфигурации сохраняется в файлах ts, которые затем считываются с помощью функции config.get(). - ✅ Лучшие практики

Стандарты кодирования

Здесь однозначно оговорено, что вся информация о конфигурации программы должна считываться через config.get() и никогда не считываться из переменных окружения вне конфигурационного файла.

концепт дизайна

Это дает следующие преимущества:

  1. Определение ясное, config.get() считывает информацию о конфигурации. В файле .env хранятся переменные среды, которые могут быть настроены по-разному в разных средах.
  2. Надежность кода, config.get() добавляет уровень абстракции поверх файла .env, делая код более надежным и гибким.

nestjs-config

метод введения

// app.module.ts 加载config文件夹中的配置文件

import { ConfigModule } from 'nestjs-config'
// 注意,这里路径要指向存放配置文件的config文件夹
ConfigModule.load(path.resolve(__dirname, '..', 'config', '**/!(*.d).{ts,js}')),

Пример использования

  1. .env文件Используется для настройки различных конфиденциальных данных в Интернете и настраиваемых данных сервера, таких как пароль базы данных, секретный ключ, IP-адрес сервера и т. д.
  2. Прочитайте и отформатируйте переменные среды в файле env с помощью библиотеки dotenv и инкапсулируйте их в общий метод.
  // env-unit.ts
  import * as dotenv from 'dotenv'
  
  dotenv.config()
  
  /**
   * 格式化环境变量
   * @param key 环境变量的键值
   * @param defaultValue 默认值
   * @param callback 格式化函数
   */
  const fromatValue = <T>(key: string, defaultValue: T, callback: (value: string) => T): T => {
      const value: string | undefined = process.env[key]
      if (typeof value === 'undefined') {
          return defaultValue
      }
      return callback(value)
  }
  
  export const env = (key: string, defaultValue: string = '') => fromatValue(key, defaultValue, value => value)
  
  export const envNumber = (key: string, defaultValue: number = 0) => fromatValue(key, defaultValue, value => Number(value))
  
  export const envBoolean = (key: string, defaultValue: boolean = false) => fromatValue(key, defaultValue, value => value === 'true')
  1. Создайте новый app.ts в папке config, прочитайте .env и отформатируйте конфигурацию с помощью методов env(), envNumber(), envBoolean(), а второй параметр может установить значение по умолчанию.
// config/app.ts
export {
  port: envNumber('APP_PORT', 3000)
}
  1. Использовать конфигурацию путем внедрения зависимостей в службу
import {InjectConfig} from 'nestjs-config';

@Injectable()
class SomeService {
  constructor(@InjectConfig() private readonly config) {
  }
  getAppHost() {
    // 使用字符串加.的格式获取配置
    return this.config.get('app.port')
  }
}