NestJs-ConfigModule.forRoot是全局的,不起作用



我正在尝试加载"process.env.AUTH_SECRET";在AuthModule中,但它给了我未定义的错误";错误:secretOrPrivateKey必须具有值";。

我确实设置了";isGlobal:真"在AppModule中;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 {}

app.module.ts

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 {}

我错过了什么或做错了什么?仅供参考,我将尝试遵循此身份验证教程。

谢谢你,

您的MongooseModuleAuthModule依赖于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' }
}
})

现在,在ConfigService准备就绪并在作用域中可用之前,JWTModule将不会加载。您很可能也需要为MongooseModule做这件事。

这就是";NestJS";方法

也就是说,如果真正需要做的只是将.env加载到process.env中,则放入:

import * as dotenv from 'dotenv';
import { resolve } from 'path';
dotenv.config({ path: resolve(__dirname, '../.env') });

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

最新更新