코딩과 결혼합니다

[오류] MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". | @nestjs/config 본문

2세/Nest.js

[오류] MongooseError: The `uri` parameter to `openUri()` must be a string, got "undefined". | @nestjs/config

코딩러버 2024. 8. 13. 19:03
728x90

문제

'process.env.MONGO_URL' 값이 'undefinde' => 데이터 베이스 URI를 제대로 인식하지 못하고 있어서 발생

로그를 찍어봤을 때도 마찬가지.

 

해결

1. env 파일 위치

'src' 디렉터리가 아닌 루트 디렉터리에 위치해 있어야 한다.✔

 

2. ConfigModule 설정 확인

환경 변수를 프로젝트에서 사용할 수 있도록 로드하는 역할을 한다.

//app.module.ts

...
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGO_URL)
  ],
...

 

1) 설정이 되어있지 않았다. 

2) error TS2307: Cannot find module '@nestjs/config' or its corresponding type declarations. 

npm install @nestjs/config

 

다시 시작했을 때에 url이 잘 연결됨을 확인하였다.

 


분명히 이 프로젝트에서는 잘 돌아가던 코드가 다른 프로젝트에서는 또 돌아가지 않는 문제가 발생하였다.

그리고 팀장님께서 도움을 주셨다...

@Module({
  imports: [
    CatsModule,
    UsersModule,
    MongooseModule.forRoot(process.env.MONGODB_URI),
    ConfigModule.forRoot(),
  ],
@Module({
  imports: [
    CatsModule,
    UsersModule,
    ConfigModule.forRoot(),
    MongooseModule.forRoot(process.env.MONGODB_URI),
  ],

 

위에는 내가 쓴 코드 그리고 아래는 수정된 코드이다. 

    ConfigModule.forRoot(),

이 위치의 차이로 환경변수 값을 사용하지 못하는 것이었다.


모듈 설정에서는 'ConfigModule'이 먼저 로드되어야

'process.env'에 설정된 값들을 사용할 수 있다.

따라서 'MongooseModule.forRoot(process.env.MONGODB_URI)'를 호출하기 전에

ConfigModule이 환경 변수를 로드하도록 해야 하는 것이다.


@nestjs/config ? 

 

nestJS 애플리케이션에서 환경 설정을 관리하는 데 도움을 주는 패키지 이다. 이 모듈을 사용하면 애플리케이션의 설정을 쉽게 로드하고 관리할 수 있으며, 코드 설정을 깔끔하게 분리할 수 있다.

 

  • 환경 변수 로딩 : '.env' 파일에 정의된 환경 변수를 자동으로 로드하고 애플리케이션 내에서 사용할 수 있게 한다.
  • 구성 파일 관리 : 여러 환경(개발, 테스트, 프로덕션 등)에 따라 다른 설정 파일을 관리할 수 있다.
  • 구성값 검증 : 설정 값의 유효성을 검사하고, 잘못된 설정이 있을 경우 오류를 발생시킬 수 있다.
  • 설정 추상화 : 설정을 서비스나 모듈에서 쉽게 주입받아 사용할 수 있게 해준다.