.env 세팅하기 #
Nest.js로 .env 값을 읽어오려면 보통 아래와 같이 합니다.
@Module({
imports: [
TypeOrmModule.forRootAsync({ useFactory: ormConfig }),
ConfigModule.forRoot({ isGlobal: true }),
UsersModule,
AuthModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
타 모듈에서 아래와 같이 process.env.xxx를 통해 접근하게 되면 이상하게 아무 값도 읽어오지 못하고 undefined를 받습니다.
@Module({
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET, // undefined 😵💫
signOptions: { expiresIn: '300s' },
}),
PassportModule,
UsersModule,
TypeOrmModule.forFeature([User, UserAuthority]),
],
controllers: [AuthController],
providers: [AuthService, UsersService, JwtStrategy],
})
export class AuthModule {}
nest.js 프로젝트가 실행될 때, env file을 읽는 작업은 비동기로 실행됩니다. 프로젝트는 비동기 함수가 끝나는 것을 기다리지 않고 nest 프로젝트를 모두 읽어버리기 때문에 이런 현상이 발생합니다.
아래와 같이 변경해줍시다.
@Module({
imports: [
JwtModule.registerAsync({
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
secret: config.get<string>('JWT_SECRET'),
signOptions: { expiresIn: '300s' },
}),
}),
PassportModule,
UsersModule,
TypeOrmModule.forFeature([User, UserAuthority]),
],
controllers: [AuthController],
providers: [AuthService, UsersService, JwtStrategy],
})
export class AuthModule {}