문제 상황
https://yoonchan1121.tistory.com/146
위 에러를 해결하고 난 이후에 정상적으로 MySQL에 연결은 되었지만 MySQL에 연결하려고 할 때 빈 사용자로 접속을 시도하고 있으며, 패스워드를 사용하지 않고 있다는 오류가 발생했다.
원인 파악
여러 블로그들을 찾아보니 이 오류가 발생하는 건 비밀번호가 틀렸거나 비밀번호 타입이 틀린 것이라고 했다.
따라서 환경 변수에서 값을 제대로 불러오지 못하고 있다고 생각이 들었고 환경 변수를 이용하는 코드를 수정해주었다.
해결 방안
왜 그런건지는 자세히 모르겠지만 NestJS를 사용할 때 기존의 process.env가 잘 작동하지 않았던 것 같아서 process.env 대신에 configService를 이용해 환경 변수 설정 값을 가져왔다.
기존 코드
// ormconfig.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const typeOrmConfig: TypeOrmModuleOptions = {
// type: process.env.DB_TYPE as 'mysql',
type: 'mysql',
host: process.env.DB_HOST,
port: +process.env.DB_PORT,
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
// autoLoadEntities: true,
synchronize: process.env.DB_SYNCHRONIZE === 'true',
};
수정된 코드
// ormconfig.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
export const typeOrmConfig = async (configService: ConfigService): Promise<TypeOrmModuleOptions> => {
return {
type: 'mysql',
host: configService.get<string>('DB_HOST'),
port: configService.get<number>('DB_PORT'),
username: configService.get<string>('DB_USERNAME'),
password: configService.get<string>('DB_PASSWORD'),
database: configService.get<string>('DB_DATABASE'),
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
synchronize: configService.get<boolean>('DB_SYNCHRONIZE'),
};
};
// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { typeOrmConfig } from './ormconfig';
import { PostModule } from './post/post.module';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
TypeOrmModule.forRootAsync({
inject: [ConfigService],
useFactory: async (configService: ConfigService) =>
await typeOrmConfig(configService),
}),
PostModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}