iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
JavaScript

不要再說你不會後端!30 天 Node.js 降維打擊指南 系列 第 11 篇

Day 11: Express 的靈魂核心—— Middleware 流程與機制實戰

  • 分享至 

  • xImage
  •  

在 Day 10 制定好 RESTful API 規範後,今天我們要探討 Express 最強大的設計模式:中間件(Middleware)。


1. 什麼是 Middleware?

Middleware(中間件)就像工廠流水線上的「檢查站」。當請求(Request)進到伺服器、還沒抵達最終路由處理函數之前,會先經過一連串的中間件進行檢查、記錄或資料處理。

每個中間件函式都可以存取三者:

  • req (Request 請求物件)
  • res (Response 回應物件)
  • next (呼叫下一個中間件的控制器)
[Request] ➔ [Middleware 1: 驗證身份] ➔ [Middleware 2: 記錄日誌] ➔ [Route Handler: 回傳資料] ➔ [Response]

2. 自訂第一個 Middleware:請求日誌器(Logger)

我們可以撰寫全域中間件,記錄每一次請求的 HTTP 方法、網址與進站時間:

// loggerMiddleware.js
const logger = (req, res, next) => {
  const now = new Date().toISOString();
  console.log(`[${now}] ${req.method} ${req.url}`);
  
  // 必須呼叫 next(),否則 Request 會卡在這裡直到 Timeout!
  next(); 
};

module.exports = logger;

在 app.js 中透過 app.use() 全域載入:

const express = require('express');
const logger = require('./loggerMiddleware');

const app = express();

// 註冊全域 Middleware
app.use(logger);

app.get('/api/users', (req, res) => {
  res.json({ message: '取得使用者清單' });
});

3. 常見的 Middleware 應用情境

  1. 內建 Middleware:解析 JSON Body
    app.use(express.json());
  2. 第三方 Middleware:如跨域處理 cors 或 HTTP 日誌套件 morgan
    app.use(cors());
  3. 特定路由鑑權(Auth Guard):只對敏感路由實施保護
// 驗證 API Key 的中間件
const checkApiKey = (req, res, next) => {
  const apiKey = req.headers['x-api-key'];
  
  if (!apiKey || apiKey !== 'secret-key-123') {
    return res.status(401).json({ error: 'Unauthorized', message: 'API Key 無效或未提供' });
  }
  
  next(); // 驗證通過,放行到下一步
};

// 僅套用到特定受保護路由
app.get('/api/admin/data', checkApiKey, (req, res) => {
  res.json({ secretData: '這是管理者專屬資料' });
});

4. 今日小結與重點

  • 中間件掌控了 Express 請求傳輸的生命週期。
  • 忘記呼叫 next() 是初學者常見的坑,會導致瀏覽器一直處於等待回應(Pending)狀態。
  • 善用中間件進行權限驗證與錯誤捕捉,能保持主要路由程式碼乾淨好維護。

上一篇
Day 10:RESTful API 設計準則
下一篇
Day 12:請求資料的守門員--Express 中得 Request Data與驗證機制
系列文
不要再說你不會後端!30 天 Node.js 降維打擊指南 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言