web-dev-qa-db-ja.com

Nest.jsでのエレガントな環境処理

現在テストカバレッジがほとんどない重要なアプリケーションにNest.jsを使用することを検討しています。環境フラグに基づいて判断を下す必要があります。主に追加の高速ミドルウェアの読み込み、別のロギン構成などです。環境変数へのアプローチは ドキュメントに記載されています を使用していますが、方法が少しわかりません洗練された(分離された、テスト可能な)さらに分岐を処理します。これはすべてルートモジュールのconfigureフックで処理できますが、個別のメソッドに分離したとしても、面倒になるように感じられ、より良い解決策があるかもしれません。どんな助けでも大歓迎です!ありがとう! ✌️

9
Steven

これは私がプロジェクトを構成するときに私が解決した方法であり、マングース接続の例config/config.module.ts

import { Module } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({
  providers: [ConfigService],
  exports: [ConfigService],
})
export class ConfigModule {}

.envファイルは本番環境では使用されないためconfig/config.service.ts

import * as dotenv from 'dotenv';
import * as fs from 'fs';

export class ConfigService {
  MONGODB_URI: string;
  private readonly envConfig: { [key: string]: string };

  constructor() {
    if (
      process.env.NODE_ENV === 'production' ||
      process.env.NODE_ENV === 'staging'
    ) {
      this.envConfig = {
        MONGODB_URI: process.env.MONGODB_URI,
      };
    } else {
      this.envConfig = dotenv.parse(fs.readFileSync('.env'));
    }
  }

  get(key: string): string {
    return this.envConfig[key];
  }
}

database/database.module.ts

import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';

@Module({
  imports: [...databaseProviders],
  exports: [...databaseProviders],
})
export class DatabaseModule {
}

database/database.providers.ts

import { ConfigModule } from '../config/config.module';
import { ConfigService } from '../config/config.service';
import { MongooseModule } from '@nestjs/mongoose';

export const databaseProviders = [
  MongooseModule.forRootAsync({
    imports: [ConfigModule],
    inject: [ConfigService],
    useFactory: async (config: ConfigService) => ({
      uri: config.get('MONGODB_URI'),
      useNewUrlParser: true,
    }),
  }),
];

10
Dragos Lupei