[Node.js] dotenv module

민수·2023년 1월 10일

.env 파일

DB의 포트나 비밀번호 등을 외부에 노출하게 되면 안되기 때문에 이전까지 DB의 비밀번호를 환경변수에 저장해서 사용하고 있었는데 이번에 .env 파일을 알게 되었다.

echo "export DB_PASS='*'" >> ~/.zshrc
source ~/.zshrc

.env 파일을 사용하면 직접 환경변수를 등록하지 않고 파일로 변수들을 관리할 수 있고 수정이 편리하다.

형태

.env

# key=value
PORT=3306
HOST=127.0.0.1

위와 같이 key=value 형태로 적어줘야 한다.

사용 방법

node.js 기준으로 dotenv 모듈을 다운로드 해준다.

npm init -y
npm install dotenv

.env

# key=value
PORT=3306
HOST=127.0.0.1

index.js

require("dotenv").config();

console.log(process.env.PORT); // 3306
console.log(process.env.HOST); // 127.0.0.1

.env 파일의 위치가 다를때


기본 경로는 파일을 실행한 절대경로에서 .env 파일을 찾기 때문에 .env 파일이 다른 곳에 있으면 원하는 값이 나오지 않을 수 있다.

.env 파일이 config 디렉토리 안에 있다면 다음과 같이 경로를 지정해 줄 수 있다.

require("dotenv").config({path: "./config/.env"});

console.log(process.env.PORT); // 3306
console.log(process.env.HOST); // 127.0.0.1

예제

다음과 같은 디렉토리 구조와 파일이 있다고 가정한다.

|-- 📁test
|    |-- 📁config
|    |    |-- .env
|    |-- 📁models
|    |    |-- index.js
|    |-- config.js

config/.env

# key=value
PORT=3306
HOST=127.0.0.1

config.js

require("dotenv").config({ path: "./config/.env" });

const port = process.env.PORT || 1234;
const host = process.env.HOST || "0.0.0.0";

const config = {
  port,
  host,
};

console.log(config.port); // 3306
console.log(config.host); // 127.0.0.1

module.exports = config;

models/index.js

const config = require("../config");

console.log(config.port); // 1234
console.log(config.host); // 0.0.0.0

위와 같이 exports한 객체를 불러와서 출력해보면 원하는 값이 나오지 않는다.
dotenv 모듈을 불러올 때 경로 설정에서 상대경로로 .env 파일의 위치를 지정해 주었기 때문이다.
index.js 파일이 실행될 때 config.js 파일을 불러오면서 dotenv 모듈이 .env 파일로부터 환경변수를 읽게되는데 index.js 파일이 위치한 models 디렉토리에 config/.env가 존재하지 않기 때문에 or 연산자의 마지막 값이 들어간 것으로 보인다.

해결

config.js

require("dotenv").config({ path: "/test/config/.env" });

const port = process.env.PORT || 1234;
const host = process.env.HOST || "0.0.0.0";

const config = {
  port,
  host,
};

console.log(config.port); // 3306
console.log(config.host); // 127.0.0.1

module.exports = config;

위와 같이 절대경로로 path를 설정해 주면 된다.

참고

dotenv Github

0개의 댓글