web-dev-qa-db-fra.com

Gestion élégante de l'environnement dans Nest.js

J'explore l'utilisation de Nest.js pour une application critique qui a actuellement très peu de couverture de test. Nous devons prendre des décisions en fonction des indicateurs d'environnement, principalement le chargement de middleware express supplémentaire, une configuration de connexion différente, etc. J'utilise l'approche des variables d'environnement comme décrite dans la documentation , mais je ne suis pas certain de la façon dont pour gérer avec élégance (isolé, testable) d'autres branchements. Je pourrais gérer tout cela dans le crochet configure de mon module racine, mais j'ai l'impression que cela deviendrait compliqué, même si je l'isolais dans des méthodes individuelles, et il pourrait y avoir une meilleure solution. Toute aide serait grandement appréciée! Merci! ✌️

9
Steven

C'est ainsi que j'ai résolu lors de la configuration du projet et aussi un exemple de connexion mangouste config/config.module.ts

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

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

Comme le fichier .env ne sera pas utilisé pour la production 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