Nest.js 中的优雅环境处理

Posted

技术标签:

【中文标题】Nest.js 中的优雅环境处理【英文标题】:Elegant environment handling in Nest.js 【发布时间】:2018-12-02 03:30:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这是我在配置项目时解决的方法,也是猫鼬连接的一个例子 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,
    ),
  ),
];

【讨论】:

这给出了以下错误Nest can't resolve dependencies of the MongooseModuleOptions (?)

以上是关于Nest.js 中的优雅环境处理的主要内容,如果未能解决你的问题,请参考以下文章

Nest.js 中的 Socket.io 确认

在 nest.js 中处理第三方依赖项

有啥方法可以在不使用 Nest.js 中的 async/await 的情况下从数据库中获取数据?

Nest.js:如何覆盖导入模块中的提供程序?

Nest.js 与 AWS Cognito,如何访问用户属性

Nest.js 获取注入器实例