利用 dotenv 套件,設置在 Node.js 裡面的環境變數


Posted by Christy on 2022-02-16

本文為利用 dotenv 套件,設置在 Node.js 裡面的環境變數的實作過程,所處在的開發階段是使用 express + sequelize 在本地端運行,內容包含摘要、實作細節、名詞解釋及注意事項。

零、內容摘要

1. 使用原因

a. 確保資訊安全,程式碼外洩時,帳密不會有安全疑慮

b. 在開發上更有彈性,更能適應不同環境及階段的檔案(開發與生產)

c. 能夠快速修改環境變數

2. 本次需要更動的部分檔案結構

// $ tree -L 2 -I "node_modules|migrations|controller|public|seeders|views|controllers|package-lock.json|package.json"
.
├── config
│   └── config.js <- config.json
├── .env
├── .gitignore
├── index.js
├── models
│   ├── index.js
└── .sequelizerc

註:想要畫出檔案結構文字版,可以參考 如何在 Mac 上印出文字版的資料夾結構

3. 設置流程

a. 安裝 dotenv

b. 新增 .env 及環境變數內容

c. 修改 config.jsonconfig.js 格式並增加內容

d. 新增 .sequelizerc 及內容

e. 修改 models 資料夾裡的 index.js 內容

f. 修改根目錄資料夾底下 index.js 的內容

g. 新增 .gitignore 及內容

4. 注意事項以及名詞解釋

一、實作細節

1. 安裝並檢查版本號:

安裝$ npm install --save--dev dotenv

檢查版本號:$ npm dotenv --version

2. 在專案根目錄底下,新增 .env 檔案並增加環境變數(填入真實帳密)

// .env

PORT=

DEV_USERNAME=
DEV_PASSWORD=
DEV_HOST=
DEV_DATABASE=
DEV_DIALECT=

PROD_USERNAME=
PROD_PASSWORD=
PROD_HOST=
PROD_DATABASE=
PROD_DIALECT=

SESSION_SECRET=

3. 修改 config.json 並增加內容

a. 修改檔案格式:config.json → config.js

b. 增加內容

新增程式碼:

require("dotenv").config();

const config = {
  // 這裡放原本 config.json 的內容
};
module.exports = config;

變成這樣:

// config.js

require("dotenv").config();

const config = {
  development: {
    username: process.env.DEV_USERNAME,
    password: process.env.DEV_PASSWORD,
    database: process.env.DEV_DATABASE,
    host: process.env.DEV_HOST,
    dialect: "mysql",
  },
  test: {
    username: process.env.DEV_USERNAME,
    password: process.env.DEV_PASSWORD,
    database: process.env.DEV_DATABASE,
    host: process.env.DEV_HOST,
    dialect: "mysql",
  },
  production: {
    username: "process.env.PROD_USERNAME",
    password: "process.env.PROD_PASSWORD",
    database: "process.env.PROD_DATABASE",
    host: "process.env.PROD_HOST",
    dialect: "mysql",
    use_env_variable: "CLEARDB_DATABASE_URL",
  },
};
module.exports = config;

註:特別注意有引號跟沒有引號的區別,在本地端的時候,環境變數不能有引號;但是部署上 Heroku 時,就要有引號。

4. 在專案根目錄底下,新增 .sequelizerc 檔案,並增加內容

其實我不太確定為什麼要用這個步驟,就算沒有它程式也可以跑,因為步驟五已經改檔案類型了?先留著備份。
註:後來幾次的部署都沒有寫這個檔案,可能有些沒有用 Sequelize 沒有 models 的專案可能需要吧?不是太理解這一塊。

"use strict";

require("dotenv").config();
const path = require("path");

module.exports = {
  config: path.resolve("config", "config.js"),
};

5. 修改 models 資料夾裡的 index.js 內容

通常在第八行:config.json -> config.js

// 原本是這樣

const config = require(__dirname + '/../config/config.json')[env];

// 改成下面這樣

const config = require(__dirname + "/../config/config.js")[env];

6. 修改根目錄資料夾底下,index.js 的內容

a. 引入 require("dotenv").config();

b. 修改 session 的 secret → secret: process.env.SESSION_SECRET,

require("dotenv").config();

app.use(
  session({
    secret: "process.env.SESSION_SECRET",
    resave: false,
    saveUninitialized: true,
  })
);

7. 在專案根目錄底下,新增檔案 .gitignore 及內容

// .gitignore

/node_modules
/*.env
.DS_Store

二、注意事項及名詞解釋

1. 注意事項:

當參數為 process.env.SESSION_SECRET 這個形式時,記得用引號括起來,config.js 裡面的環境變數也是一樣要特別注意。

(O) "process.env.SESSION_SECRET"
(X) process.env.SESSION_SECRET

環境變數在本地跟部署上有點不一樣,本地嘗試的結果是「不要用引號括起來才能跑」,但是部署上 Heroku 的時候,卻是「一定要用引號括起來才部署成功」,詳情可以參考 Deploy express app in Heroku with cleardb

2. 名詞解釋

a. The .sequelizerc file

.sequelizerc 檔案的作用是為了變更設定檔位置、名稱,那感覺如果要有這個檔案,就不用去 models > index.js 裡面做設定了。

"use strict";

require("dotenv").config();
const path = require("path");

module.exports = {
  // 使用 config/config.js 為設定檔
  config: path.resolve("config", "config.js"),
};

b. .env

放環境變數的地方,會有真實的帳號、密碼,在上傳 git 之前,務必放在 .gitignore

三、參考資料:

「Node.js」利用 .env 與環境變數隱藏敏感資料 by dotenv

Sequelize 學習筆記










Related Posts

Git 常忘指令

Git 常忘指令

[Python] How to setup a json or yaml to an object in python

[Python] How to setup a json or yaml to an object in python

[InfluxDB] 使用 Telegraf + Prometheus 監控 InfluxDB 效能

[InfluxDB] 使用 Telegraf + Prometheus 監控 InfluxDB 效能


Comments