本章將學習 Nuxt 的路由中間件系統,建立頁面級別的權限控制機制。
1 核心概念 基礎理論
Nuxt 的路由中間件 (Route Middleware) 是基於 Vue Router 的導航守衛。它們在「換頁之前」執行。
三種等級的中間件
1. 匿名 (Inline)
直接寫在頁面的 definePageMeta 裡(適合超簡單邏輯)。
2. 具名 (Named)
放在 middleware/ 資料夾,檔名即名稱(例如 auth.ts)。需要在頁面中明確指定 middleware: 'auth' 才會生效。
3. 全域 (Global)
檔名加上 .global 後綴(例如 auth.global.ts)。每一頁都會自動執行,不用指定。
核心指令:
• navigateTo('/login'):把使用者踢到別頁
• abortNavigation():留在原地,不讓過去
2 給 Claude Code 的中文指令 實作練習
我們要製作一個簡單的「假登入驗證」系統:
- • 一個
auth中間件:檢查有無登入,沒登入就踢去登入頁 - • 一個
dashboard頁面:套用這個中間件(受保護頁面) - • 一個
login頁面:讓使用者點擊登入
請幫我建立路由守衛 (Route Middleware) 系統:
- 建立
app/middleware/auth.ts:- 使用
defineNuxtRouteMiddleware((to, from) => { ... })。 - 內部邏輯:使用
useState('isLoggedIn')取得登入狀態(如果沒有值預設為 false)。 - 判斷:如果
isLoggedIn為 false,則回傳return navigateTo('/login')。
- 使用
- 建立受保護頁面
app/pages/dashboard.vue:- 顯示文字「歡迎來到會員中心 (Dashboard)!」。
- 在
<script setup>中使用definePageMeta({ middleware: 'auth' })來套用剛剛寫的守衛。
- 建立登入頁面
app/pages/login.vue:- 顯示文字「請先登入」。
- 加入一個按鈕「模擬登入」。
- 點擊按鈕時:設定
useState('isLoggedIn').value = true,然後執行navigateTo('/dashboard')。
- 修改首頁
app/pages/index.vue,加入連往/dashboard的連結。
3 驗收重點
請依照以下劇本進行測試:
攔截測試(未登入):
- 重新整理瀏覽器(確保狀態重置)
- 在首頁點擊
/dashboard連結 - 預期結果:網址瞬間變成
/login,畫面顯示「請先登入」
登入流程測試:
- 在登入頁點擊「模擬登入」按鈕
- 預期結果:網址變成
/dashboard,畫面顯示「歡迎來到會員中心」
直接訪問測試(SSR):
- 在網址列直接輸入
http://localhost:3000/dashboard然後按 Enter - 預期結果:因為伺服器端渲染時 useState 預設是 false,你應該會被伺服器端轉址到
/login
💡 架構師筆記
這是面試必考題,請務必分清楚 Server Middleware 與 Route Middleware 的差異:
| 特性 | Server Middleware (L13) | Route Middleware (L14) |
|---|---|---|
| 位置 | server/middleware/ | app/middleware/ |
| 執行引擎 | Nitro(後端) | Vue Router(前端 + SSR) |
| 控制對象 | API 請求、HTML 請求 | 頁面切換 |
| 用途 | Log、Header、API 驗證 | 權限檢查、頁面轉導 |