本篇文章同步更新於個人部落格,歡迎交流指教~謝謝您的閱讀
Middleware 為 Nuxt 內的 路由守衛(Navigation Guards),相當於 Vue Router 內的 beforeEach callback,協助我們在進到頁面前進行事件處理(例如權限檢查)
middleware/
定義,並在需要的頁面引入.global
後綴,在所有頁面切換時自動執行範例:
middleware/
|—— auth.js
defineNuxtRouteMiddleware()
輔助函示:定義 route middlewarenavigateTo()
輔助函示:導航到其他頁面abortNavigation()
輔助函示:中斷導航,顯示錯誤資訊以及跳到錯誤頁面// middleware/auth.js
export default defineNuxtRouteMiddleware((to, from) => {
const isLoggedIn = true; // 判斷是否登入
const hasPermission = false; // 判斷有無頁面權限
if (!isLoggedIn) {
return navigateTo('/login');
}
if (!hasPermission) {
return abortNavigation({
statusCode: 403
statusMessage: '無頁面權限'
});
}
});
在頁面透過 definePageMeta()
輔助函式定義 middleware
// pages/about.vue
<template>
<div>...</div>
</template>
<script setup>
definePageMeta({
middleware: [ auth ] // or middleware: 'auth'
});
</script>
接下來當我們切到 http:localhost:3000/about
,驗證無頁面權限跳轉至錯誤畫面
全域引入的 Middleware。同具名定義方式,不過檔名需加上 .global
後綴,在所有頁面切換時自動執行
範例:
middleware/
|—— auth.global.js
在頁面內各別定義
// pages/about.vue
<template>
<div>...</div>
</template>
<script setup>
definePageMeta({
middleware: [
(to, from) => {
// 這裡是匿名 middleware 內容
}
]
});
</script>
執行順序首先為全域 Middleware,接下來才是頁面定義的 Middleware(依照順序)
範例:
middleware/
|—— auth.global.js
|—— redirect.js
// pages/about.vue
<template>
<div>...</div>
</template>
<script setup>
definePageMeta({
middleware: [
(to, from) => {
// ...
},
'redirect'
]
});
</script>
執行順序分別為:
auth.global.js
redirect.js
使用 addRouteMiddleware(name, middleware, options)
輔助函式動態加入 Middleware
範例: 在 plugins/
加入 middleware
會覆蓋掉定義在 middleware/
資料夾內同名檔案(auth.js)
// plugins/add-middleware.js
export default defineNuxtPlugin(() => {
addRouteMiddleware('auth', (to, from) => {
// ...
});
});
// plugins/add-middleware.js
export default defineNuxtPlugin(() => {
addRouteMiddleware((to, from) => {
// ...
});
});
options 加上 { global: true }
// plugins/add-middleware.js
export default defineNuxtPlugin(() => {
addRouteMiddleware('auth',
(to, from) => {
// ...
},
{ global: true }
);
});
參考資源:
https://nuxt.com/docs/guide/directory-structure/middleware
https://nuxt.com/docs/api/utils/define-nuxt-route-middleware