NestJs - ConfigModule.forRoot isGlobal 不工作
NestJs - ConfigModule.forRoot isGlobal not working
我正在尝试在 AuthModule 中加载“process.env.AUTH_SECRET”,但它给了我未定义的错误“错误:secretOrPrivateKey 必须有一个值”。
我确实在 AppModule 中设置了“isGlobal: true”,它能够很好地读取“process.env.MONGO_URL”。
我还安装了 dotenv,如果我这样做的话,它看起来很好:
import * as dotenv from 'dotenv';
dotenv.config();
export const jwtConstants = {
secret: process.env.AUTH_SECRET,
};
但我宁愿按照“NestJs”的方式来做,因为 the doc 说添加 isGlobal 应该使环境可用于所有其他模块。
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 {}
我错过了什么或做错了什么?仅供参考,我正在尝试遵循此 authentication tutorial.
谢谢,
您的 MongooseModule
和 AuthModule
依赖于您的 ConfigModule
,但他们不知道。
您的模块正忙于加载,但是您的 ConfigModule
必须执行异步 i/o 进程(读取您的 .env)才能准备就绪。与此同时,Nest 继续加载而不等待 ConfigModule 完成它的工作除非另一个它发现另一个模块依赖于它的一个导出。
这是模块 *Async 风格的方法发挥作用的地方。它们使您可以控制模块实例化。在这种情况下,它们允许我们从 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 在发生任何其他事情之前同步加载它
我正在尝试在 AuthModule 中加载“process.env.AUTH_SECRET”,但它给了我未定义的错误“错误:secretOrPrivateKey 必须有一个值”。
我确实在 AppModule 中设置了“isGlobal: true”,它能够很好地读取“process.env.MONGO_URL”。
我还安装了 dotenv,如果我这样做的话,它看起来很好:
import * as dotenv from 'dotenv';
dotenv.config();
export const jwtConstants = {
secret: process.env.AUTH_SECRET,
};
但我宁愿按照“NestJs”的方式来做,因为 the doc 说添加 isGlobal 应该使环境可用于所有其他模块。
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 {}
我错过了什么或做错了什么?仅供参考,我正在尝试遵循此 authentication tutorial.
谢谢,
您的 MongooseModule
和 AuthModule
依赖于您的 ConfigModule
,但他们不知道。
您的模块正忙于加载,但是您的 ConfigModule
必须执行异步 i/o 进程(读取您的 .env)才能准备就绪。与此同时,Nest 继续加载而不等待 ConfigModule 完成它的工作除非另一个它发现另一个模块依赖于它的一个导出。
这是模块 *Async 风格的方法发挥作用的地方。它们使您可以控制模块实例化。在这种情况下,它们允许我们从 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 在发生任何其他事情之前同步加载它