Nuxt3 專案中的中介軟體會放在專案根目錄的 middleware 資料夾中,如果檔名後面(不包含副檔名)是 .global ,例如 auth.global.ts ,就會自動備註冊為全域中介軟體,會在每次路徑變更時自動執行。
這樣我們就可以在 auth.global.ts 中檢查是否有登入,假設尚未登入就跳轉到登入頁面:
我們可以在跳轉到登入頁面時將原始要跳轉的路徑放到 query string 中:
這樣連結就會類似於: http://localhost:3000/login?redirect=/home
在登入頁面登入成功後加上以下的程式碼,就會自動跳轉到原始的網址了:
參考資料:
Nuxt3 - middleware
Nuxt3 - useRoute
這樣我們就可以在 auth.global.ts 中檢查是否有登入,假設尚未登入就跳轉到登入頁面:
export default defineNuxtRouteMiddleware((to, from) => {
if (to.path === '/login') return
const _token = useCookie('jwt'); // 假設確認有沒有登入的方式是 cookie 中有 jwt 這個值
if (_token.value) return; // 有的話就不處理
return navigateTo('/login'); // 跳轉到登入頁面
})
紀錄原始路徑
沒有登入時就跳轉到登入頁面,但是登入後該如何自動跳轉回原始網頁呢?我們可以在跳轉到登入頁面時將原始要跳轉的路徑放到 query string 中:
export default defineNuxtRouteMiddleware((to, from) => {
if (to.path === '/login') return
const _token = useCookie('jwt'); // 假設確認有沒有登入的方式是 cookie 中有 jwt 這個值
if (_token.value) return; // 有的話就不處理
return navigateTo(`/login?redirect=${to.fullPath}`); // 跳轉到登入頁面,並記錄目標路徑
})
這樣連結就會類似於: http://localhost:3000/login?redirect=/home
在登入頁面登入成功後加上以下的程式碼,就會自動跳轉到原始的網址了:
// 從 query string 取得 redirect 參數
let redirectPath = useRoute().query.redirect as string | undefined;
console.log(`redirectPath: ${redirectPath}`);
if (!redirectPath) redirectPath = '/';
await useRouter().push(redirectPath);
參考資料:
Nuxt3 - middleware
Nuxt3 - useRoute
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com