【问题标题】:Why is .env undefined?为什么 .env 未定义?
【发布时间】:2021-08-24 06:46:12
【问题描述】:

app.module.ts

@Module({
    imports: [
        ConfigModule.forRoot({
            isGlobal: true
        }),
        MongooseModule.forRoot(process.env.MONGO_DB_URI, {useFindAndModify: false}),
        UsersModule,
        RolesModule,
        AuthenticationModule,
        TwoFactorAuthModule,
        RememberPasswordModule,
        RegistrationLinkModule
    ],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {}

authentication.module.ts

@Module({
    imports: [
        JwtModule.register({
            secret: process.env.JWT_SECRET
        }),
        UsersModule,
        TwoFactorAuthModule,
        RememberPasswordModule,
        RegistrationLinkModule
    ],
    controllers: [AuthenticationController],
    providers: [AuthenticationService]
})
export class AuthenticationModule {}

在 AuthenticationModule 中 process.env 是未定义的。但是如果我在 AuthenticationService 中使用它,它就可以正常工作。如何在模块文件中使用 process.env?

【问题讨论】:

标签: nestjs


【解决方案1】:

正如弗朗索瓦所说,您可以config() 方法作为main.ts 文件中的第一件事。请记住,在您导入具有使用 process.env 的装饰器的任何文件之前,这必须完成。

另一种选择是使用像@golevelup/profiguration 这样的包,它类似于dotenv,可以在装饰器内部使用。

Istiyak Tailor 引用的最后一个选项是使用@nestjs/config 包以及ConfigModuleConfigService。为此,您应该使用异步注册方法,例如registerAsyncforRootAsync。然后你可以使用类似的配置

JwtModule.registerAsync({
  inject: [ConfigService],
  useFactory: (config: ConfigService) => ({
    secret: config.get('JWT_SECRET'),
  })
})

(与MongooseModule 类似,但使用forRootAsync 而不是registerAsync

这告诉 Nest 等待 ConfigModule 完成实例化,并在 JwtModuleMognooseModule 的实例化中使用 ConfigService

您也可以用use a configuration class 代替useFactory,但它们本质上是一回事。

【讨论】:

    【解决方案2】:

    在引导应用程序之前,您应该尝试导入 dotenv 并在 main.ts 文件的开头进行配置。

    import * as dotenv from 'dotenv'
    dotenv.config()
    
    async function bootstrap() { ... }
    

    正如dotenv doc 中所述:“在您的应用程序中尽早要求并配置 dotenv。”

    【讨论】:

    • 在nest.js 中使用dotenv 不是一个好习惯。在 nest.js 中已经配置了一个单独的模块来检索环境变量,即 ConfigModule
    • 我同意更好的方法是使用 ConfigModule:docs.nestjs.com/techniques/configuration
    猜你喜欢
    • 2017-12-09
    • 2020-05-12
    • 2021-07-22
    • 2021-07-18
    • 2012-06-21
    • 2022-01-05
    • 2017-10-10
    • 2021-01-17
    • 2017-09-02
    相关资源
    最近更新 更多