37
Re:Nuxt 100 天練習曲
Day 37

後端的好幫手 (Server 篇下)

Day 37·Server Middleware·Server Utils

1. 網站的守門員:`server/middleware/`

Server Middleware (伺服器中介軟體) 就像是您整個後端服務的總守門員

注意

它和我們在 Day 10 學的「路由中介軟體 (Route Middleware)」不同!

路由中介軟體:只在頁面切換時運作,屬於前端 Vue 的一部分。

伺服器中介軟體:在每一次請求(無論是 API 還是頁面)到達伺服器時,都會最先執行,屬於後端 Nitro 的一部分。

只要您在 server/middleware/ 資料夾裡建立一個檔案,它就會自動變成一個全域的中介軟體。

最佳使用時機:

記錄 Log

記錄每一筆進來的請求。

權限檢查

在處理任何請求前,先檢查使用者是否有合法的 token。

擴充請求物件

event 物件加上一些共用的資料或工具函式。

範例:記錄每一筆請求

server/middleware/logger.ts
// 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
// 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
// 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
// server/api/admin/dashboard.ts
export default defineEventHandler((event) => {
  // 直接使用,不需要 import
  checkUserPermission(event);

  return { data: '這是管理員才能看到的機密資料' };
});

今日總結

今天我們學會了使用 server/ 資料夾下的三個好幫手:

middleware/

在所有請求前執行的守門員

routes/

建立無 /api 前綴的路由

utils/

放置後端專用的共用工具函式

程式碼組織的最佳實踐

善用這些資料夾,可以讓您的後端程式碼結構更清晰、更有條理,也更容易維護!