에러 발생 상황

데이터베이스 관련 정보는 소중하기 때문에 production 전용 환경변수 파일은 서버에 접속 후에 envs 디렉토리 하위에 직접 .env.production 파일을 생성했습니다.

이후 cross-env NODE_ENV=production pm2 start src/bin/www.js 명령 스크립트를 실행해 서버를 실행시켰습니다.

그러나 NODE_ENV 값이 설정되지 않는 경우 예외 처리 로직이 실행되어 로그 메세지 상에는 'process.env.NODE_ENV를 설정하지 않았습니다.' 가 보여질 뿐이었습니다.

위에서 보시다시피 명령 스크립트 상에 NODE_ENV 를 production 으로 설정했음에도 불구하구요.

 

로그 메세지 상에 환경변수 파일을 파싱하는 config.js 쪽에서 에러가 발생했으니 config.js 에 작성된 코드에 문제가 있을 것이라고 예상했습니다.

=== 쓰면 안되고... == 을 써야 합니다...

결국 해결을 했는데, 문제는 바로 NODE_ENV 값에 따라 각각 다른 .env 파일을 파싱하는 로직이었습니다.

기존에 에러를 발생시킨 코드는 다음과 같습니다.

const dotenv = require('dotenv');

if (process.env.NODE_ENV === 'production') {
  dotenv.config({ path: 'envs/.env.production' });
} else if (process.env.NODE_ENV === 'development') {
  dotenv.config({ path: 'envs/.env.development' });
} else {
  throw new Error('process.env.NODE_ENV를 설정하지 않았습니다.');
}

'===' 비교 연산자의 경우 좌변항과 우변항의 값뿐만 아니라 자료형까지 일치하는지 판단합니다.

그러나 process.env.NODE_ENV 의 자료형은 string 이 아니어서 if, else if 문 조건식을 만족하지 못하고 결국 에러가 발생한 거죠.

 

저는 '===' 비교 연산자 대신 '==' 비교 연산자로 변경해 좌변항과 우변항 간 값 일치 여부만 판단하도록 변경했습니다.

const dotenv = require('dotenv');

if (process.env.NODE_ENV == 'production') {
  dotenv.config({ path: 'envs/.env.production' });
} else if (process.env.NODE_ENV == 'development') {
  dotenv.config({ path: 'envs/.env.development' });
} else {
  throw new Error('process.env.NODE_ENV를 설정하지 않았습니다.');
}

이후 cross-env NODE_ENV=production pm2 start src/bin/www.js 명령 스크립트를 실행해 서버가 정상적으로 실행된 것을 확인했습니다.

 

복사했습니다!