iT邦幫忙

2025 iThome 鐵人賽

DAY 20
0
自我挑戰組

API 全攻略系列 第 20

Day 20:Middleware 介紹與應用

  • 分享至 

  • xImage
  •  

前言

在前面幾天的實作中,我們的 API 逐漸成形:

  • Day 17:CRUD 設計
  • Day 18:連接資料庫(MongoDB)
  • Day 19:Schema 設計與資料驗證
    不過,當專案越來越大時,我們會遇到一些問題:
  • 每個路由都要重複寫「錯誤捕捉」
  • 想紀錄每次 API 請求的時間與 URL
  • 想限制某些 API 必須帶 Token 才能訪問
    這時候, Middleware(中介層) 就派上用場了。

什麼是 Middleware?

在 Express 中,Middleware 本質上就是一個函式,會在「請求(Request)」與「回應(Response)」之間運行。
結構大概是這樣:

function middleware(req, res, next) {
  console.log('Middleware triggered');
  next(); // 繼續執行下一個 middleware 或 route handler
}

Middleware 的特點:

  1. 順序執行:Express 會依照你宣告的順序執行 Middleware。
  2. 共享邏輯:可以把多個路由共用的邏輯抽出來。
  3. 控制流程:可以選擇是否繼續執行下一個 middleware(next())。

建立 Middleware

1. 建立請求紀錄 Logger

我們希望每次 API 請求時,能在 console 中顯示時間、方法與路徑。

// middleware/logger.js
function logger(req, res, next) {
  const now = new Date().toISOString();
  console.log(`[${now}] ${req.method} ${req.originalUrl}`);
  next(); // 繼續下一步
}

module.exports = logger;

在 app.js 中使用:

const express = require('express');
const app = express();
const logger = require('./middleware/logger');

app.use(logger); // 所有請求都會經過 logger

2. 建立錯誤處理 Middleware

我們之前在路由中用 try/catch 捕捉錯誤,但這樣每個路由都要重複寫。
我們可以改用統一的錯誤處理 Middleware。

// middleware/errorHandler.js
function errorHandler(err, req, res, next) {
  console.error(err.stack);
  res.status(err.status || 500).json({
    error: err.message || 'Server Error'
  });
}

module.exports = errorHandler;

在 app.js 中使用:

const errorHandler = require('./middleware/errorHandler');

// 放在所有路由的最後
app.use(errorHandler);

3. 建立驗證 Middleware(範例:檢查 Token)

我們可以建立一個簡單的 Middleware,檢查請求 Header 是否有帶 x-api-key。

// middleware/auth.js
function auth(req, res, next) {
  const apiKey = req.headers['x-api-key'];
  if (apiKey === 'my-secret-key') {
    next(); // 驗證成功,繼續
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
}

module.exports = auth;

在路由中使用:

const auth = require('../middleware/auth');

router.get('/secure', auth, (req, res) => {
  res.json({ message: 'You accessed a protected route!' });
});

Middleware 的應用場景

  1. 請求紀錄:像 logger,方便除錯與監控。
  2. 錯誤處理:集中管理錯誤回應,避免重複代碼。
  3. 身分驗證:檢查 Token 或 API Key,保護敏感路由。
  4. 資料驗證:在進入 Controller 前先檢查 request body。
  5. 速率限制(Rate Limiting):避免 API 被濫用。
  6. CORS 設定:允許跨域請求。

小結

今天我們學到了 Middleware(中介層) 的概念與應用:

  • 它是一個在 RequestResponse 之間運行的函式
  • 可以用來抽離共用邏輯,例如 logger、errorHandler、auth
  • 在大型專案中,Middleware 是維持架構整潔的關鍵
    到這裡,我們的 Todo API 架構已經越來越專業了!

上一篇
Day 19:資料驗證與 Schema 設計
下一篇
Day 21:API 測試自動化(使用 Jest / Supertest)
系列文
API 全攻略24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言