後端的好幫手 (Server 篇下)
1. 網站的守門員:`server/middleware/`
Server Middleware (伺服器中介軟體) 就像是您整個後端服務的總守門員。
它和我們在 Day 10 學的「路由中介軟體 (Route Middleware)」不同!
路由中介軟體:只在頁面切換時運作,屬於前端 Vue 的一部分。
伺服器中介軟體:在每一次請求(無論是 API 還是頁面)到達伺服器時,都會最先執行,屬於後端 Nitro 的一部分。
只要您在 server/middleware/
資料夾裡建立一個檔案,它就會自動變成一個全域的中介軟體。
最佳使用時機:
記錄 Log
記錄每一筆進來的請求。
權限檢查
在處理任何請求前,先檢查使用者是否有合法的 token。
擴充請求物件
為 event
物件加上一些共用的資料或工具函式。
範例:記錄每一筆請求
// server/middleware/logger.ts
export default defineEventHandler((event) => {
// getRequestURL 是一個內建的工具函式
console.log('新的請求進來了:', getRequestURL(event));
});
現在,每一次您重新整理頁面或呼叫 API,都會在終端機看到這條 log。
2. 無前綴的路由:`server/routes/`
我們昨天學到,放在 server/api/
的檔案,網址會自動加上 /api
前綴。
但如果您希望建立一個沒有 /api
前綴的後端路由,例如一個 /sitemap.xml
,那就可以把它放在 server/routes/
資料夾。
// server/routes/sitemap.xml.ts
export default defineEventHandler((event) => {
// ... 產生 sitemap 的邏輯 ...
const sitemap = '<?xml version="1.0" encoding="UTF-8"?><urlset>...</urlset>';
// 設定 response header,告訴瀏覽器這是 XML 檔案
setResponseHeader(event, 'Content-Type', 'text/xml');
return sitemap;
});
現在,您可以直接訪問 http://localhost:3000/sitemap.xml
。
3. 您的後端工具箱:`server/utils/`
就像前端有 composables/
和 utils/
,後端也有一個專門放共用工具函式的地方,那就是 server/utils/
。
放在這裡的函式,會自動在您所有 server/
目錄下的檔案中可用,不需要手動 import!
範例:建立一個檢查權限的工具函式
// server/utils/auth.ts
import type { H3Event } from 'h3';
export function checkUserPermission(event: H3Event) {
// 這裡只是一個簡單的範例
const user = event.context.user; // 假設 user 物件已在中介軟體中被加入
if (!user || !user.isAdmin) {
throw createError({ statusCode: 403, statusMessage: 'Forbidden' });
}
return true;
}
現在,您可以在任何 API 路由中,直接使用這個函式:
// server/api/admin/dashboard.ts
export default defineEventHandler((event) => {
// 直接使用,不需要 import
checkUserPermission(event);
return { data: '這是管理員才能看到的機密資料' };
});
今日總結
今天我們學會了使用 server/
資料夾下的三個好幫手:
middleware/
在所有請求前執行的守門員
routes/
建立無 /api 前綴的路由
utils/
放置後端專用的共用工具函式
善用這些資料夾,可以讓您的後端程式碼結構更清晰、更有條理,也更容易維護!