中間件就像是大樓的警衛,在每一個伺服器請求到達目標之前進行攔截與處理。
1 核心概念
中間件就像是大樓的警衛。
基本設定
- •位置:
server/middleware/資料夾。 - •觸發時機:在每一個伺服器請求到達目標之前。
運作邏輯
1.使用者請求 /api/data
2.Middleware 攔截:記錄「有人在 12:00 訪問了 /api/data」
3.Middleware 放行:繼續交給 /api/data 處理
寫法
寫法跟 API 完全一樣,使用 defineEventHandler。唯一的差別是檔案位置決定了它是 API (終點) 還是 Middleware (過程)。
// API 終點
server/api/hello.ts
// Middleware 過程
server/middleware/logger.ts
2 給 Claude Code 的中文指令 實作
我們要建立一個簡單的「Log 記錄器」,它會在終端機印出每一個被訪問的網址。另外,我們也要試著在回應中偷加一個自訂的 Header。
請複製以下指令給 Claude:
請幫我建立一個 Server Middleware:
- 建立
server/middleware/logger.ts。 - 使用
defineEventHandler((event) => { ... })。 - 在 handler 內部執行兩件事:
- 使用
console.log印出請求的方法與網址 (格式:[Middleware Log] New request: <Method> <URL>)。提示:可以用event.method和getRequestURL(event)。 - 使用
setResponseHeader(event, 'x-custom-header', 'Nuxt-Middleware-Learning')來為每一個回應加上自訂標頭。
- 使用
- 不需要回傳任何值 (除非你想攔截請求直接回傳,否則預設會繼續往下執行)。
3 驗收重點
請檢查 Claude 完成後的結果:
終端機記錄檢查 (Server Log)
- 回到瀏覽器,隨便點擊幾個頁面,或是重新整理。
- 觀察你的 VS Code 終端機 (Terminal)。
- 你應該會看到一排排訊息不斷跑出來:
[Middleware Log] New request: GET /api/hello
[Middleware Log] New request: GET /
結論:警衛成功攔截並記錄了所有活動。
瀏覽器 Header 檢查
- 打開瀏覽器開發者工具 (
F12) → Network 分頁。 - 點擊任意一個請求(例如 localhost document 或 API request)。
- 查看 Response Headers (回應標頭)。
- 你應該要找到一行:
x-custom-header: Nuxt-Middleware-Learning
結論:你成功在全站的回應中注入了標記。
💡 架構師筆記 (Middleware 執行順序)
Server Middleware (server/middleware) vs Route Middleware (middleware/):
Server Middleware (本課教的):
- 跑在後端伺服器上
- 處理 API 請求、SSR 頁面請求
- 是用 Nitro 引擎跑的
Route Middleware (第 14 課要教的):
- 跑在 Vue Router 上(通常在瀏覽器端)
- 處理頁面切換權限(如:未登入踢回首頁)
這其實是兩樣完全不同的東西!如果你要在「API 層級」擋人,用 Server Middleware。如果你要在「頁面切換」擋人,用 Route Middleware。