# 🏅 Day 19 - Middleware
Express 在收到 request 到回傳 response,中間會經過一系列的 middleware(中間件/中介軟體)處理,
middleware 本身像是一個守門員的概念,通常會使用 `app.use((req, res, next) => {...})` 並帶入 function,function 中除了 req 及 res 參數,還有 next,當執行 `next()` 就代表要將控制權交給下一個 Middleware
需注意若在 Middleware 最後沒有執行 `next()`,程式就會停留在這個 Middleware,無法進入下一個階段
```javascript=
app.use((req, res, next) => {
console.log('middleware');
next();
});
```
使用 `app.use((req, res, next) => {...})` 的寫法在接收 request 時都會經過此 middleware,若是只想要在接收特定 request 時經過 middleware 把關,也可以改為此寫法
```javascript=
const checkLogin = (req, res, next) => {
const url = req.url;
if (url !== '/') {
next();
} else {
res.send('你的登入資料有錯!');
}
};
// 將 middleware 放在特定的路由中,只有接收到此 request 才會經過 checkLogin middleware
app.get('/', checkLogin, function(req, res) {
res.send('<html><head></head><body><h1>Login</h1></body></html>');
});
```
### 參考資源
- [使用 Express 中介軟體](https://expressjs.com/zh-tw/guide/using-middleware.html)
- 課程影音「middleware 設計」
題目
---
嘗試使用 `app.use()` 設計一個處理錯誤路由以及一個伺服器程式錯誤的 Middleware,
- 處理錯誤路由:
當 client 端造訪錯誤的路由,就回傳狀態碼 404,並回傳 JSON 物件,status 為 `'error'`,回饋訊息 message 為`無此頁面資訊`
```
```
- 伺服器程式錯誤:
當 server 端有程式出錯的情況,導致 client 端無法正確造訪路由,就回傳狀態碼 500,並回傳 JSON 物件,status 為 `'error'`,回饋訊息 message 為 `系統錯誤,請恰系統管理員`
```
```
## 回報流程
將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔!
解答位置請參考下圖(需打開程式碼的部分觀看)
![](https://i.imgur.com/vftL5i0.png)
<!-- 解答:
處理錯誤路由:
```
app.use(function(req, res, next) {
res.status(404).json({
status: 'error',
message: "無此頁面資訊",
});
});
```
伺服器程式錯誤:
```
app.use(function(req, res, next) {
res.status(500).json({
status: 'error',
message: '系統錯誤,請洽系統管理員'
});
});
```
-->
回報區
---
<!--
將答案貼至下方表格內,格式:
| Discord 暱稱 | [CodePen](連結) |
-->
| Discord | CodePen / 答案 |
|:-------------:|:-----------------:|
| xxx | [CodePen]() |
| 苡安 | [hackmd](https://hackmd.io/@L7K9-66lSeagS28AP0_GjQ/HJ0dYTabC) |
| Aida | [CodePen](https://codepen.io/ada23410/pen/poBBMRe?editors=0010) |
| jenny7532 | [CodePen](https://codepen.io/wei-chen-wu/pen/MWRdgvZ) |
| Chia Pin | [CodePen](https://codepen.io/joker-cat/pen/abxroed) |
| wei | [CodePen](https://codepen.io/Wei-the-sasster/pen/XWQwWmm) |
| tung030374 | [CodePen](https://codepen.io/tung__u/pen/QWPRNXJ) |
| william威良 | [CodePen](https://codepen.io/snowman12320/pen/jORoamo?editors=1010) |
| william_hsu | [CodePen](https://codepen.io/william8815/pen/oNOREJx) |
|Lobinda|[HackMD](https://hackmd.io/@Lobinda/BJd6LvlfC)|
| 2魚 | [CodePen](https://codepen.io/ijrekmsn-the-sans/pen/RwOzWrg) |
|Mei|[CodePen](https://codepen.io/l_umei/pen/OJGeXxE)|
|Benson|[CodePen](https://codepen.io/nosneb83/pen/zYXVwQV)|
| albertyang3576 |[CodePen](https://codepen.io/albertyang3576/pen/WNWqWMv)|
|ej_chuang|[CodePen](https://codepen.io/EJChuang/pen/WNWqVGV)|
| runweiting |[CodePen](https://codepen.io/weiting14/pen/yLrmMLB)|
| Tiya |[CodePen](https://codepen.io/Tiya_blank/pen/rNbQPbY)|
| Hank |[CodePen](https://codepen.io/tw1720/pen/OJYJVPG)|
| Fabio20 | [CodePen](https://codepen.io/fabio7621/pen/ZENbygv) |