如何在模块导入/配置中设置 .env 变量

Posted

技术标签:

【中文标题】如何在模块导入/配置中设置 .env 变量【英文标题】:How to set .env variables in a module import / configuration 【发布时间】:2020-01-18 04:40:54 【问题描述】:

我想在我的应用中使用.env 文件。

我为此创建了两个文件(一个模块和一个服务):

config.module.ts

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

@Module(
    providers: [
        provide: ConfigService,
        useValue: new ConfigService(`$process.env.NODE_ENV || 'development'.env`),
    ],
    exports: [ConfigService],
)

export class ConfigModule 

config.service.ts

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

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

    constructor(filePath: string) 
        // stock the file
        this.envConfig = dotenv.parse(fs.readFileSync(filePath));
    

    // get specific key in .env file
    get(key: string): string 
        return this.envConfig[key];
    


问题是在我的主模块中,我想连接到mongo,但我不知道如何恢复我的变量,因为该模块是在中声明的:

其实这是一个给我信息的类

root.module.ts

import  Module  from '@nestjs/common';
import  MongooseModule  from '@nestjs/mongoose';
import  EnvService  from './env';
import  HelloModule  from './module/hello.module';
import  ContentModule  from './module/content.module';
import  CategoriesModule  from './module/categories.module';
import  AuthorModule  from './module/author.module';

const env = new EnvService().getEnv();

@Module(
    imports: [
        // connect to the mongodb database
        MongooseModule.forRoot(`mongodb://$env.db_user:$env.db_pass@$env.db_uri:$env.db_name/$env.db_name`, env.db_option),
        // ping module
        HelloModule,
        // data module
        ContentModule,
        CategoriesModule,
        AuthorModule,
    ],
)

export class RootModule 

【问题讨论】:

【参考方案1】:

查看文档中的async configuration section。使用异步配置,您可以注入依赖项并将其用于配置:

MongooseModule.forRootAsync(
  imports: [ConfigModule],
  useFactory: async (configService: ConfigService) => (
    uri: `mongodb://$configService.get(db_user):$configService.get(db_pass)@$configService.get(db_uri):$configService.get(db_port)/$configService.get(db_name)`,
  ),
  inject: [ConfigService],
);

【讨论】:

以上是关于如何在模块导入/配置中设置 .env 变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nuxt 配置中设置 .env 文件路径?

如何在绝对导入中设置没有点符号的 Pypi 包 - python3

如何在 wasm 中更改导入模块名称“env”?

在 vs 代码中导入的 python 模块中设置断点

如何在另一个模块中设置全局变量?

如何在 VBA 中设置全局变量