express.Router 拆分了路由,今天我們要為這些路由制定最嚴謹的命名與回傳標準。在 RESTful 的世界裡,網址 (URL) 只能出現名詞,用來標示你要操作的目標(資源);而你要對它做什麼事,全權交給 HTTP Method (GET, POST, PUT, DELETE) 來決定。
假設你正在開發一款 RPG 遊戲,裡面有一個核心角色叫做「無名神 (Nameless God)」,你需要設計存取這個角色與其裝備的 API。
傳統的超雷命名法 (動詞混雜):
/getNamelessGod (取得角色)/createCharacter (創建角色)/updateWeapon (更新武器)/deleteItem (刪除道具)RESTful 降維打擊命名法:
/characters (取得所有角色清單)/characters (創建一個新角色)/characters/nameless-god (讀取特定角色「無名神」的資料)/characters/nameless-god (覆蓋/更新「無名神」的整體資料)/characters/nameless-god (刪除「無名神」這個角色)你看出來了嗎?網址完全沒有變過,永遠都是 /characters,我們只透過切換 HTTP Method,就完美表達了四種完全不同的操作意圖。
在設計 RESTful API 時,請將這四條規則刻在你的鍵盤上:
/users, /products, /orders。/hero-equipments 而不是 /heroEquipments 或 /hero_equipments。/characters/nameless-god/inventory/my-first-sword
/characters.json。資料格式是由 HTTP Request Header 的 Accept 或 Content-Type 來決定的。一個專業的後端工程師,不會讓前端永遠只收到 200 OK,然後把錯誤訊息包裝在 JSON 裡面。你必須讓 HTTP 狀態碼在第一線就精準表達結果:
200 OK:最常見的成功回應(適用於 GET, PUT, DELETE)。201 Created:資源成功建立(專屬 POST 新增資料成功時使用)。400 Bad Request:前端傳來的資料格式錯誤、漏傳必填欄位。401 Unauthorized:未登入,或是沒有帶上有效的 Token。403 Forbidden:已登入,但你的權限不足(例如一般玩家想呼叫管理員專用的 API)。404 Not Found:請求的資源(如某個角色 ID 或網址)不存在。500 Internal Server Error:伺服器內部錯誤(你的程式碼寫爛了,或是資料庫掛了)。讓我們把 Day 9 的路由加上精準的狀態碼。打開你昨天的 routes/users.js,修改其中的 POST 邏輯:
// POST /api/users - 新增使用者
router.post('/', (req, res) => {
const { username, email } = req.body;
// 1. 驗證資料:如果漏傳欄位,回傳 400
if (!username || !email) {
// return 會提早結束函式,防止繼續往下執行
return res.status(400).json({
error: 'Bad Request',
message: 'username 與 email 為必填欄位'
});
}
// 2. 模擬寫入資料庫成功,回傳 201 Created
const newUser = { id: 101, username, email };
res.status(201).json({
message: '角色創建成功',
data: newUser
});
});