本文為利用 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.json
為 config.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
裡