###### tags: `AC 教案修改` # 2-3 後端 MongoDB 連線問題 [源 Notion task](https://www.notion.so/achq/2-3-MongoDB-f867e123d338432a9b722a73cff87b5d) 作業時間 13:30 ~ 17:00,約 150 min。 ## mongoose 版本更新問題 branch mongoose-upgrade 我這邊沒有出現 (node:17656) Warning,無法重現問題,所以無法確定是否成功修復。 ![](https://i.imgur.com/OXv2wjq.png) 姑且嘗試將 mongoose 升級為 v6.6.1 運行專案是可以 work 的。但會需要一併更新文案跟圖片,因為上面依舊是寫著 v5.9.7,例如「安裝 Mongoose」的部分會需要改。 ```bash # NG [~/todo-list] $ npm i mongoose@5.9.7 # OK [~/todo-list] $ npm i mongoose@6.6.1 ``` [U66](https://lighthouse.alphacamp.co/courses/100/units/20900) 的「插曲:處理 DeprecationWarning 警告」條目,可能需要拿掉,因為新版本沒有這個問題。 ## 環境變數問題 ### repo 更新 branch dotenv github repo 協作者,似乎加錯專案了。 ```bash # NG, 這個已經有配置 dotenv https://github.com/ALPHACamp/todo-list-express-oauth # 應該是這個? https://github.com/ALPHACamp/todo-list-express ``` 以下以此 repo 為前提進行操作。 ```bash https://github.com/ALPHACamp/todo-list-express ``` 問題: - 該 repo 當前存在一個 `node-18` branch,需要確認此專案是否有升級 Node.js 版本? - 目前先以 Node.js v14 為前提追加 `dotenv` ## 教案更新內容 (環境變數) 替換原 [U66](https://lighthouse.alphacamp.co/courses/100/units/20900) 「設定環境變數」區塊。 ### 設定環境變數 先前介紹過連線字串裡其實包含了「帳號」與「密碼」這類的敏感資訊,通常我們不會想把這類型的資訊明明白白地寫在程式碼裡。 一般來說,當我們想要**隱藏一些敏感資訊**時,我們會藉由設定環境變數的方式,來將指定資訊傳入程式碼,同時又可以**避免敏感資訊直接暴露在程式碼中**。 「環境變數」可以理解成宣告在 Node.js 外部的變數,然後在 Node.js 中去取用他。概念上跟我們平常在 JS 中宣告變數是很類似的。 在 Node.js 宣告變數並取用。 ```javascript const myVar = "Hello World" console.log(myVar) // Hello World ``` 我們也可以在系統層的終端機上宣告臨時的「環境變數」,並在 Node.js 中取用。 (關閉終端機後就會消失) ```bash # Mac 終端機宣告環境變數 $ export FOO="bar" # Windows 終端機宣告環境變數 $ set "FOO=bar" # 隨便建立一支測試用的 temp.js 加入這行 console.log(process.env.FOO) # 在終端機上執行該 js 就能呼叫到方才宣告的環境變數 $ node temp.js > bar ``` process.nev 是 Node.js 提供的一個介面,讓我們可以調用宣告在系統層的環境變數。例如上面的範例,我們宣告了一個叫做 `FOO` 的環境變數。在 Node.js 中就可以使用 `process.env` 去取用。 ```javascript process.env.FOO ``` 查看自己電腦裡有哪些環境變數 (複製原教案收合按鈕內容) macOS 宣告環境變數 (複製原教案收合按鈕內容) Windows 宣告環境變數 (複製原教案收合按鈕內容) 如果想更進一步的了解環境變數,可以查看下一單元[【補充】環境變數大解密](https://lighthouse.alphacamp.co/courses/100/units/28193)。 接下來,為了方便管理環境變數,我們將透過相關套件 [dotenv](https://www.npmjs.com/package/dotenv) 來設定環境變數。 #### 安裝並設定 dotenv ```bash # 加上 -D 使其註冊為 devDependencies $ npm i dotenv -D ``` dotenv 是一個方便我們管理環境變數的工具,他可以讓我們把環境變數直接寫在專案裡,以專案為單位去管理。這樣會比在終端機或 OS 上宣告要來的更方便,也不會汙染我們的系統。 接下來在專案中建立 `.env` 文件,並在上面定義環境變數,把資料庫的連線字串複製上去。 ```bash # 將這行加到 .env 文件 MONGODB_URI=mongodb+srv://alpha:camp@cluster0.fovij.mongodb.net/todo-list?retryWrites=true&w=majority ``` 但由於這是敏感資料,所以我們**必須將其排除在 git 紀錄之外**。 打開 `.gitignore` 把 `.env` 文件添加進去。 ```bash # dotenv .env ``` 這邊要注意的是,因為我們將 `.env` 排除了,為了提示其他工程師這個專案有使用到 `.env`,習慣性上會添加一個 `env.example` 文件將其紀錄在 git 上,並寫上空的 key,然後在 GitHub README 中寫上相關說明。 ```bash # 將這行加到 env.example 文件 # 可以利用 value 的底方寫上提示說明,或使用 # 符號在上面添加註解 MONGODB_URI=YOUR_MONGODB_URI ``` 環境變數的相關檔案都添加完成後,我們需要在 app 的進入點去初始化 dotenv,這樣 Node.js 就能抓到寫在 `.env` 上的環境變數了。 ```javascript // app.js const express = require('express') const mongoose = require('mongoose') // 載入 mongoose // 加入這段 code, 僅在非正式環境時, 使用 dotenv if (process.env.NODE_ENV !== 'production') { require('dotenv').config() } const app = express() mongoose.connect(process.env.MONGODB_URI) // 設定連線到 mongoDB ```