.env当我开发应用程序时,我将配置保存在文件中。
这是我的app.module.ts:
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
TypeOrmModule.forRoot({
autoLoadEntities: true,
database: process.env.TYPEORM_DATABASE,
host: process.env.TYPEORM_HOST,
password: process.env.TYPEORM_PASSWORD,
port: (process.env.TYPEORM_PORT as unknown) as number,
type: 'postgres',
username: process.env.TYPEORM_USERNAME,
}),
AuthModule,
(...)
],
controllers: [],
providers: [],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)
并typeorm使用变量的正确值process.env.TYPEORM_...。
这是我的auth.module.ts:
@Module({
providers: [JwtStrategy, (...)],
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET,
(...)
}),
(...)
],
controllers: [AuthController],
})
export class AuthModule {}
Run Code Online (Sandbox Code Playgroud)
我从 JwtModule 收到错误,该错误secret不能为空。当然JWT_SECRET是在.env文件中设置的。
这是我的jwt.strategy.ts:
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
secretOrKey: process.env.JWT_SECRET,
(...)
});
}
(...)
}
Run Code Online (Sandbox Code Playgroud)
在这里,process.env.JWT_SECRET已正确加载。
我无法理解为什么我的环境变量在我的应用程序中并非随处可用。
如果我不得不猜测,那么您调用dotenv的config()方法为时已晚。在 Typescript 中,装饰器在模块导入时运行,因此任何内容@Module()几乎都会立即运行。但是,类方法的函数调用中的任何内容在调用该函数之前都不会运行。我建议在您的main.ts文件中将这些作为前两行:
import { config } from 'dotenv';
config();
Run Code Online (Sandbox Code Playgroud)
这样,在其他任何文件有机会运行之前,任何.env文件都会被读取并添加到其中。process.env
ConfigModule当您使用Nest 提供的时,另一个选项是使用异步注册过程,其中您使用工厂或类来提供正确的配置。在你的 TypeOrm 配置中,异步注册过程可能如下所示:
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
autoLoadEntities: true,
database: config.get<string>('TYPEORM_DATABASE'),
host: config.get<string>('TYPEORM_HOST'),
password: config.get<string>('TYPEORM_PASSWORD'),
port: config.get<number>('TYPEORM_PORT'),
type: 'postgres',
username: config.get<string>('TYPEORM_USERNAME'),
})
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |