Re:Nuxt

12/20
Lesson 12

Handling Body & Query

接收參數與表單

本章將學習如何在後端處理兩種主要的資料傳遞方式:GET 請求的網址參數與 POST 請求的表單資料。

1 核心概念

後端接收資料主要分兩種方式,Nitro 把這件事變得超級簡單:

GET 請求(網址參數)

網址樣子:/api/search?keyword=nuxt

後端寫法:const query = getQuery(event)

結果:query.keyword 等於 'nuxt'

POST 請求(隱藏內容)

情境:表單送出、登入、存檔。

後端寫法:const body = await readBody(event)

命名小技巧

你可以透過檔名來限制 HTTP 方法:

server/api/submit.post.ts
← 只接受 POST 請求(GET 會報錯 405 Method Not Allowed)
server/api/search.get.ts
← 只接受 GET 請求

2 給 Claude Code 的中文指令 複製使用

我們要建立兩個 API,一個負責用 GET 接收名字打招呼,一個負責用 POST 接收使用者資料。

請幫我建立處理 GET 與 POST 請求的後端與測試頁面:

  1. 建立 GET API server/api/greet.get.ts
    • 使用 getQuery(event) 取得網址參數 name
    • 回傳:{ message: 'Hello ' + name }
  2. 建立 POST API server/api/submit.post.ts
    • 使用 await readBody(event) 取得前端送來的 JSON 資料。
    • 回傳一個物件,包含接收到的資料以及一個狀態欄位:{ status: 'success', receivedData: body }
  3. 建立前端頁面 app/pages/form-test.vue
    • 有一個輸入框 input(綁定 name ref)。
    • 按鈕 A「測試 GET」:點擊後呼叫 useFetch('/api/greet', { query: { name: name.value } })
    • 按鈕 B「測試 POST」:點擊後呼叫 useFetch('/api/submit', { method: 'POST', body: { name: name.value, age: 18 } })
    • 在下方顯示 API 回傳的結果(response data)。

3 驗收重點

請檢查 Claude 完成後的結果:

GET 測試(Query)

  1. 在輸入框打 "Jack"。
  2. 點擊「測試 GET」。
  3. 結果顯示:Hello Jack
  4. 檢查 Network:確認請求網址是 /api/greet?name=Jack

POST 測試(Body)

  1. 點擊「測試 POST」。
  2. 結果顯示:{ status: 'success', receivedData: { name: 'Jack', age: 18 } }
  3. 檢查 Network:確認 Request Payload(或是 Body)裡面是 JSON 格式的資料。

檔名檢查

  1. 確認 API 檔名分別是 .get.ts.post.ts
  2. 試著用瀏覽器直接訪問 http://localhost:3000/api/submit(這是 GET 請求)。
預期結果:應該要看到錯誤畫面(405 Method Not Allowed),這代表 Nuxt 幫你擋掉了錯誤的方法。

💡 架構師筆記(API 的型別)

你可能已經發現,使用 useFetch 呼叫內部 API 時,Nuxt 其實知道回傳的型別

當你在 VS Code 寫 data.value. 時,如果它自動跳出 messagestatus 提示,這就是 Nuxt 最強大的 End-to-End Type Safety

你不用手寫 TypeScript Interface,Nuxt 自動幫你推導出來了
12