iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 22
0
Modern Web

從無到有,打造一個漂亮乾淨俐落的 RESTful API系列 第 22

[Day-22] 設定joi與config dotenv環境參數

首先祝各位2018年快樂呀~新的一年祝各位順順利利!

本章節會學到

  • 了解與建立 dotenv 環境參數
  • 了解 joi 功用與建立
  • joi + dotenv 改寫 config.js 建立全域變數

事前準備

今天要繼續實作的程式是延續 [Day-17] 新增 middleware(body-parser、cors、morgan) 的專案繼續實作,想跟著今天的實作可以先下載下面的整包程式,記得要先 yarn install 將整個依賴的軟體安裝回來。

程式碼:https://github.com/andy6804tw/RESTful_API_start_kit/releases/tag/V4.0.0

什麼是 dotenv ?

dotenv 是將 .env 文件中的環境參數加載到 process.env。這個檔要建立在最外層資料夾,在其他文件中先引入 require('dotenv').config() 後只要再呼叫 PROCESS.ENV.[變數名稱] 就能將此環境參數撈出來了,通常還會搭配 joi 來做設定,此外這邊要注意的是 .env 檔是特有的隱藏檔並不會被同步上傳傳到 GitHub 上,這樣每次 clon 下來都要手動建立一個新的檔案很麻煩,所以我都會額外建立一個叫 .example.env 的副本,每次 clone 下來直接在終端機鍵入 cp .example.env .envcp 是 Linux 複製檔案的指令(copy),那行指令的意思是將複製一個 .example.env 檔案並且命名為 .env

設定 dotenv 環境參數

1.安裝 dotenv
yarn add dotenv
2.建立 .env
  • 首先新增一個 .example.env 的檔案

在這個檔案中初始化三個變數分別為 PORT(阜號)、 NODE_ENV(開發模式)、VERSION(版本)。

/* .example.env 全域變數的設定檔範本 */
PORT=3000
NODE_ENV=development
VERSION=1.0.0
  • 使用 cp 指令產生副本 .env

cp 是 Linux 的其中一道指令,它具有複製的功能,cp 也就是英文 (copy) 的意思,下面指令的意思是將複製一個 .example.env 檔案並且命名為 .env

cp .example.env .env

https://ithelp.ithome.com.tw/upload/images/20180101/201072471f0TabpjGT.png
https://ithelp.ithome.com.tw/upload/images/20180101/20107247mkpfiml1mW.png

什麼是 joi ?

joi 就好比是一個驗證器,你可以自己規範 schema 來限制資料格式,有點像是正規表示法,這邊來舉個例子好了,利如 PORT 只允許輸入數字若輸入字串就會被阻擋 PORT: Joi.number() ,這樣有好處萬一有使用者不按照規範輸入數值他會在 middleware 拋出一個錯誤告訴你這邊有問題要你馬上修正。

https://ithelp.ithome.com.tw/upload/images/20180101/20107247B8pcfn217f.png

使用 joi 來驗證環境參數

1.安裝 joi
yarn add joi
2.修改 config.js

在此篇教學中我們有先建立此檔了當時很死的把變數寫在這裡面,所以這邊就搭配環境參數把剛設定的參數引入進來,其中在變數產生時我們利用 joi 來驗證該變數是否符合格式規範,首先要在最上宣告 require('dotenv').config() 這樣系統才會抓到 .env 設定檔。

/* config.js */
 import Joi from 'joi';

 // require and configure dotenv, will load vars in .env in PROCESS.ENV
 require('dotenv').config();

 // 建立每個變數 joi 驗證規則
 const envVarSchema = Joi.object().keys({
   NODE_ENV: Joi.string().default('development').allow(['development', 'production']), // 字串且預設值為development 並只允許兩種參數
   PORT: Joi.number().default(8080), // 數字且預設值為 8080
   VERSION: Joi.string() // 字串
 }).unknown().required();

 // process.env 撈取 .env 內的變數做 joi 驗證
 const { error, value: envVars } = Joi.validate(process.env, envVarSchema);

 if (error) {
   throw new Error(`Config validation error: ${error.message}`);
 }

 const config = {
   version: envVars.VERSION, // 版本
   env: envVars.NODE_ENV,  // 開發模式
   port: envVars.PORT  // 阜號
 };

 export default config;  // 匯出共用

joi 的 GitHub 官方文件中有很多關於變數的規範,有興趣可以看去看看。

測試

全部修改完畢後就可以啟動來測試囉!記得先 yarn buildyarn start 來執行程式。

https://ithelp.ithome.com.tw/upload/images/20180101/20107247lnHMyoN8sb.png

範例程式碼:https://github.com/andy6804tw/RESTful_API_start_kit/releases/tag/V5.0.0
文章同時發表於:https://andy6804tw.github.io/2018/01/01/joi-config-dotenv/


上一篇
[Dat-21] 建立資料庫欄位
下一篇
[Day-23] API與資料庫連線設定
系列文
從無到有,打造一個漂亮乾淨俐落的 RESTful API43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
pandaOAO
iT邦新手 5 級 ‧ 2021-10-18 22:14:49

.env 似乎要移至 config 資料夾中

10程式中 iT邦研究生 4 級 ‧ 2021-10-19 09:20:53 檢舉

pandaOAO Hi! .env 要跟你執行程式碼指令同一層目錄。所以我習慣放最外層。

pandaOAO iT邦新手 5 級 ‧ 2021-10-20 00:11:23 檢舉

原來如此!當時應因自身操作失誤導致於失敗,剛剛測試後發現歸咎錯原因,感謝您熱心教學!

10程式中 iT邦研究生 4 級 ‧ 2021-10-20 09:44:21 檢舉

不客氣~

我要留言

立即登入留言