---
lang: zh
tags: js,web,backend,express
---
# Express 網頁後端建立
:::success
因為是運行在 node.js 環境下,因此先至 [官網](https://nodejs.org/en/) 下載安裝 node.js
:::
## NPM (Node Package Manager)
:::info
首先 node.js 的專案管理大多依賴 npm 運行,因此先來了解一些 npm 的知識
:::
Node Package Manager 如其名是 node.js 的套件管理工具,可以用來安裝各種 node.js 的 套件、專案管理、開發工具、script 都包含在內
### 建立專案
```
$ npm init
```
而從 npm 建立起來的專案中都會有下面三個內容
1. node_modules : 各種套件存放的地方
2. package.json : npm 環境下的各種設定
3. package-lock.json : 詳細記錄套件版本確保相容性問題 [詳細來由](https://ithelp.ithome.com.tw/articles/10191888)
### 推上 git
若將 npm 的專案推上 git,須設定 `.gitignore` 只將必要的文件推上去,`node_modules` 是不需要上去的,下次拉下來要重建專案時只需要在目錄下輸入
```
$ npm install
```
就會根據 `package-lock.json` 的內容去做套件安裝
### 安裝套件:
```
$ npm install <package-name> --save
```
`npm install` 會到 [npm-registry](https://www.npmjs.com/) 上找符合 `<package-name>` 的套件下載下來安裝,而常會加入 `--save` 的參數,目的是可以讓其他相依的依賴套件一並寫入 `package-lock.json` 之中,方便之後恢復專案環境
## Express
[官方文件](https://expressjs.com/zh-tw/)
:::info
靈活輕便的 node.js Web API 建置套件,個人認為很適合用來作為 RESTful API 的開發
:::
---
### 安裝
+ 首先建立一個 node.js 的專案
```
$ npm init
```
+ 安裝 express 的套件
```
$ npm install express --save
```
+ 基本範例 `index.js`
```javascript
var express = require('express');
var app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000,() => {
console.log('Example app listening on port 3000!');
});
```
+ 啟動程式
```
$ node index.js
```
### CORS 問題
```
$ npm install cors --save
```
```javascript
var cors = require('cors');
app.use(cors());
```
[expressjs/cors](https://github.com/expressjs/cors)
預設是允許全部,記得部屬上去正式機器要加入限制 IP,不要全部允許
#### 額外工具推薦
==nodemon==
```
$ node install -g nodemon
```
> -g 是全域安裝,因此只要裝過一次,這台機器的所有專案都可以使用
每次更改程式碼都要重新 `node app.js` 一次實在有點麻煩,安裝這個之後用 `nodemon app.js` 來執行,每次更新存檔就會自動重啟一次 server 方便許多。
==eslint==
用工具幫你統一程式碼風格
```
$ npm install -g eslint
```
安裝完之後輸入下面指令
```
$ eslint --init
```
回答一連串問題決定你的程式碼要遵循的風格,之後會幫你創建 `.eslintrc` 的檔案裏面就寫著剛剛回答的選項,也可以隨時更改。[更多規則參考](https://eslint.org/docs/rules/)
> 建議搭配 vscode extendsion [Eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) 來做使用
個人偏好規則
```javascript=
{
"rules": {
"indent": ["error", 4],
"quotes": ["error", "double"],
"semi": ["error", "always"],
"space-infix-ops": ["error", { "int32Hint": false }],
"key-spacing": ["error", { "beforeColon": false }],
"curly": "error",
"object-curly-spacing": ["error", "always"],
"comma-spacing": ["error", { "before": false, "after": true }]
}
}
```
==dotenv==
建立專案環境變數
```
$ npm install dotenv --save
```
安裝完之後,在專案底下建立 `.env`
```
NODE_ENV = 'development'
PROJECT_NAME = 'express_test'
```
然後在 js 裡使用
```javascript
require('dotenv').config(); // 調用這行就可以載入環境變數
console.log(process.env.NODE_ENV);
console.log(process.env.PROJECT_NAME);
```
==moment==
方便針對 datetime 的各種操作
---
### 專案結構
額外加上幾個資料夾之後,結構上目前長這樣
+ config: 設定檔
+ helper: 各種小工具
+ log: 就 log
+ model: 跟資料庫溝通
+ routes: 路由分發以及初步資料驗證
+ service: 共用的各種服務
+ controller: 商業邏輯
```
├── config/
├── controller/
├── helper/
├── log/
├── models/
├── node_modules/
├── routes/
├── service/
├── .env
├── .eslintrc.json
├── .gitignore
├── index.js
├── package-lock.json
└── package.json
```
### Logger
==pino==
第三方打包好的 logger
==express-pino-logger==
針對 express 內容進行 pino log 的封裝,包含 request 跟 response 內容都完整包裝在內
==pino-pretty==
美化 `pino` log 訊息內容,順便 format 時間資訊
### 部署
+ 這部分須再多加研究
[正式作業最佳作法:效能和可靠性](https://expressjs.com/zh-tw/advanced/best-practice-performance.html)
```
NODE_ENV = 'production' // 務必更改
LOG_LEVEL = 'info' // 不一定改成 info 視需要更改,至少不應在 debug level
```
### Router
#### 取得參數
```javascript
function(req, res){
req.query; // url: /passrecord/?page=1&rowsPerPage=15 可選參數
req.params; // url: /passrecord/:rowPerPage/:page 必選參數
req.body; // request-body 夾帶資料內容
}
```
### 資料驗證
==express-validator==
[官方文件](https://express-validator.github.io/docs/)
### Authentication
[[譯]您閱讀的 Nodejs/Express.js 驗證機制教學(很可能)錯了](https://andyyou.github.io/2017/09/06/your-nodejs-authentication-probably-wrong/)
※沒太多時間研究
### RESTful API 設計
[API 實作(一):規劃 RESTful API 要注意什麼](https://noob.tw/restful-api/)
[簡明RESTful API設計要點](https://tw.twincl.com/programming/*641y)
[HTTP 狀態碼](https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81)
### 資料庫溝通請看: [Sequelize 初學](https://hackmd.io/sB3qYzLrS1qOUVAWwmg0IA)