NestJs-ConfigModule.forRoot全局不工作

NestJs-ConfigModule.forRoot全局不工作,nestjs,dotenv,nestjs-config,Nestjs,Dotenv,Nestjs Config,我试图在AuthModule中加载“process.env.AUTH_SECRET”,但它给了我一个未定义的错误“error:secretroprivateKey必须有一个值” 我在AppModule中设置了“isGlobal:true”,它可以很好地读取“process.env.MONGO_URL” 我还安装了dotenv,如果我安装了,它会读起来很好: import * as dotenv from 'dotenv'; dotenv.config(); export const jwtCo

我试图在AuthModule中加载“process.env.AUTH_SECRET”,但它给了我一个未定义的错误“error:secretroprivateKey必须有一个值”

我在AppModule中设置了“isGlobal:true”,它可以很好地读取“process.env.MONGO_URL”

我还安装了dotenv,如果我安装了,它会读起来很好:

import * as dotenv from 'dotenv';
dotenv.config();

export const jwtConstants = {
  secret: process.env.AUTH_SECRET,
};

但我更愿意采用“NestJs”的方式,正如前面所说的那样,添加isGlobal应该使env可用于所有其他模块

auth.module.ts

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { UserModule } from '../user/user.module';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
import { JwtModule } from '@nestjs/jwt';

@Module({
  imports: [
    UserModule,
    PassportModule,
    JwtModule.register({
      secret: process.env.AUTH_SECRET, //Cannot read this.
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService, LocalStrategy],
  exports: [AuthService, JwtModule],
})
export class AuthModule {}

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule } from '@nestjs/config';
import { AuthModule } from './auth/auth.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    UserModule,
    MongooseModule.forRoot(process.env.MONGO_URL), // Can read this fine
    AuthModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

app.module.ts

import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';
import { UserModule } from '../user/user.module';
import { PassportModule } from '@nestjs/passport';
import { LocalStrategy } from './local.strategy';
import { JwtModule } from '@nestjs/jwt';

@Module({
  imports: [
    UserModule,
    PassportModule,
    JwtModule.register({
      secret: process.env.AUTH_SECRET, //Cannot read this.
      signOptions: { expiresIn: '60s' },
    }),
  ],
  providers: [AuthService, LocalStrategy],
  exports: [AuthService, JwtModule],
})
export class AuthModule {}

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule } from '@nestjs/config';
import { AuthModule } from './auth/auth.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    UserModule,
    MongooseModule.forRoot(process.env.MONGO_URL), // Can read this fine
    AuthModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

我错过了什么或做错了什么?仅供参考,我正试图遵循这一点


谢谢,

您的
MongooseModule
AuthModule
依赖于您的
ConfigModule
,但他们不知道

您的模块正忙于加载,但是您的
ConfigModule
必须先执行异步i/o进程(读取您的.env),然后才能准备就绪。同时,Nest在不等待ConfigModule完成其作业的情况下继续加载,除非它发现另一个模块依赖于它的导出之一

这就是模块*异步风格方法发挥作用的地方。它们使您能够控制模块的实例化。在此上下文中,它们允许我们从
ConfigModule
注入
ConfigService
,这在
ConfigService
准备就绪之前不会发生

因此,将JWTModule配置从使用
.register
更改为
.registerAsync
以注入
ConfigService
,这是您的目标:

JWTModule.registerAsync({
    inject: [ConfigService],
    useFactory: (config: ConfigService) => {
      secret: config.get<string>('AUTH_SECRET'),
      signOptions: { expiresIn: '60s' }
    }
})

在main.ts文件的开头。这将导致dotenv在发生任何其他事情之前同步加载它

您的
MongooseModule
AuthModule
依赖于您的
ConfigModule
,但他们不知道

您的模块正忙于加载,但是您的
ConfigModule
必须先执行异步i/o进程(读取您的.env),然后才能准备就绪。同时,Nest在不等待ConfigModule完成其作业的情况下继续加载,除非它发现另一个模块依赖于它的导出之一

这就是模块*异步风格方法发挥作用的地方。它们使您能够控制模块的实例化。在此上下文中,它们允许我们从
ConfigModule
注入
ConfigService
,这在
ConfigService
准备就绪之前不会发生

因此,将JWTModule配置从使用
.register
更改为
.registerAsync
以注入
ConfigService
,这是您的目标:

JWTModule.registerAsync({
    inject: [ConfigService],
    useFactory: (config: ConfigService) => {
      secret: config.get<string>('AUTH_SECRET'),
      signOptions: { expiresIn: '60s' }
    }
})

在main.ts文件的开头。这将导致dotenv在发生任何事情之前同步加载它

尝试使用
JwtModule.registerAsync
而不是
JwtModule.register
来避免使用
process.env.*
就像尝试使用
JwtModule.registerAsync
而不是
JwtModule.register
来避免使用
process.env.*
就像