Maison  >  Article  >  interface Web  >  La meilleure façon de configurer des variables d'environnement et des environnements multiples dans Nest.js

La meilleure façon de configurer des variables d'environnement et des environnements multiples dans Nest.js

WBOY
WBOYoriginal
2024-08-10 06:40:36385parcourir

The Best way to configure environment variables and multi environments in Nest.js

Ce que j'aime vraiment chez Nest.js, c'est qu'il s'agit d'un puissant framework node.js complet qui vous offre des solutions complètes proposées pour la création applications back-end.

Il intègre dès le départ le support TypeScript et combine des éléments de OOP (programmation orientée objet), FP (programmation fonctionnelle) et FRP (Functional Reactive Programming), comme le dit le site officiel.

Il y a aussi une architecture dès le départ, ce qui est incroyable pour quelqu'un comme moi qui aime travailler avec des projets d'architecture bien structurés.

La documentation à elle seule est très impressionnante et couvre tous les aspects, y compris comment définir les variables d'environnement, mais pour moi
Je n'ai pas vraiment compris comment définir plusieurs environnements.

Peut-être parce que je suis nouveau sur node.js et nestjs, cependant, lorsque je cherchais des articles sur Internet, ils montraient toujours un moyen d'utiliser directement la bibliothèque dotenv au lieu d'utiliser nestjs de manière native, qui utilise dotenv sous le capuche.

Et après de nombreuses heures à regarder des articles à côté de la documentation, j'ai élaboré une solution native de Nestjs et j'ai pensé la partager.


Premier

Supposons que nous ayons besoin de 2 environnements pour notre projet 'dev' et 'prod'
et nous avons besoin de 2 variables d'environnement par environnement : PORT et DATABASE_URL.

1- Créez 2 fichiers .env pour stocker  PORT et DATABASE_URL et nommez les fichiers ( .env.dev et .env.prod.)

PORT=3500

DATABASE_URL="file:./dev.db"`

2- Créez une variable env appelée NODE_ENV, mais cette fois au lieu de la stocker dans un fichier .env, nous allons l'injecter dans les scripts de démarrage pour dev et prod.

Le paramètre NODE_ENV peut être différent selon les plates-formes (windows, mac ou Linux), nous allons donc installer un package cross-div pour nous permettre de définir des variables d'environnement sur plusieurs plates-formes.

installer en utilisant npm

$ npm install --save-dev cross-env

ou en utilisant pnpm

$ pnpm install --save-dev cross-env

Ensuite, modifiez vos scripts package.json pour utiliser cross-env :

"scripts": {
    "start:dev": "cross-env-shell NODE_ENV=dev nest start --watch",
    "start:prod": "cross-env-shell NODE_ENV=prod node dist/main",
}

Alors maintenant, lorsque vous exécutez votre application avec

npm run start:dev 

ou

pnpm run start:dev

Vous disposez de NODE_ENV=dev et vous pouvez l'utiliser dans toute l'application.

3- Pour que Nestjs puisse lire les fichiers .env, nous devons utiliser ConfigModule et le configurer correctement, mais nous devons d'abord l'installer.

npm

$ npm i --save @nestjs/config

pnpm

$ pnpm i --save @nestjs/config

4- Utiliser ConfigModule :

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      envFilePath: `.env.${process.env.NODE_ENV}`,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

envFilePath : est utilisé pour spécifier un autre chemin pour le fichier .env. 
ou lire un fichier différent du fichier .env par défaut

.env.${process.env.NODE_ENV} se traduira par .env.dev et
Si on exécute la commande

npm run start:prod

.env.${process.env.NODE_ENV} se traduirait par .env.prod.

5- Comment accéder à nos variables d'environnement
Pour accéder aux variables d'environnement, nous utilisons ConfigModule.

Nous pouvons l'utiliser dans main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  const configService = app.get(ConfigService);
  const port = configService.get('PORT');

  await app.listen(port);
}

ou si nous en avons besoin ailleurs, nous utilisons l'injection.
par exemple

@Injectable()
export class AppService {
  constructor(private configService: ConfigService) {}

  getHello(): string {
    return (
      this.configService.get<string>('DATABASE_URL')
    );
  }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn