Nest.js中优雅的环境处理

问题描述 投票:2回答:1

我正在探索使用Nest.js作为目前几乎没有测试覆盖率的关键应用程序。我们需要根据环境标志做出决策,主要是加载额外的快速中间件,不同的登录配置等。我正在使用环境变量的方法作为described in the documentation,但我不知道如何优雅(隔离,可测试)处理进一步的分支。我可以在我的根模块的configure钩子中处理所有这些,但感觉它会变得混乱,即使我将它分离成单独的方法,并且可能有更好的解决方案。任何帮助将不胜感激!谢谢! ✌️

node.js typescript environment-variables nestjs
1个回答
6
投票

这是我在配置项目时解决的问题,也是mongoose连接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.module.ts

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

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

数据库/ 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,
    }),
  }),
];

© www.soinside.com 2019 - 2024. All rights reserved.