今天的開發重點是 Step 6:加入輸入驗證與強化錯誤處理,目的是確保系統的資料完整性與 API 安全性。Claude設計了一個 三層式驗證架構,並搭配統一的錯誤處理機制,讓整體 API 更加健壯且易於維護。
位置:src/main/js/core/validation/validators.js
這一層提供各種通用的驗證工具函式,可在不同模組中重複使用,包括:
validateEmail()
:使用正則表達式檢查 Email 格式validatePassword()
:檢查密碼強度(大小寫、數字、特殊字元)validateObjectId()
:驗證 MongoDB ObjectId 格式validateDate()
:檢查日期格式,並支援過去/未來日期限制validatePhoneNumber()
:驗證國際電話格式validateNumericRange()
:數值範圍驗證(含最小/最大值)validateString()
:字串長度與模式檢查validateArray()
:陣列結構與項目驗證validateEnum()
:列舉值驗證(含大小寫選項)validateFile()
:檔案上傳驗證(大小與類型限制)sanitizeInput()
:輸入清理,防止 XSS 攻擊範例程式碼(簡化版):
static validateEmail(email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const isValid = typeof email === 'string' && emailRegex.test(email);
return { isValid, message: isValid ? null : 'Invalid email format' };
}
這層提供了統一的錯誤訊息格式 ({ isValid, message }),便於在後端或前端直接使用。
位置:src/main/js/core/validation/schemas.js
定義針對不同業務場景的預設驗證規則,例如:
userRegistration
:完整的使用者註冊驗證userLogin
:登入憑證檢查rehabTaskCreation
:復健任務建立驗證(指示與排程)progressSession
:進度紀錄驗證(疼痛與活動度評估)passwordChange
:密碼修改驗證queryParams
:URL 查詢參數驗證commentCreation
:留言建立驗證(類型與可見性規則)這一層能確保不同 API 的輸入欄位皆符合預期格式,並減少重複程式碼。
位置:src/main/js/api/middleware/validationMiddleware.js
最後一層是與 Express 路由直接整合的中介層,用來在 API 接收請求時即時檢查輸入資料:
validateBody()
:驗證 request body
是否符合對應的 SchemavalidateQuery()
:驗證 URL 查詢參數validateParams()
:驗證路由參數(例如 ObjectId)validateFileUpload()
:檢查檔案上傳的大小與格式validateCustom()
:支援客製化驗證邏輯validateFieldCombinations()
:跨欄位條件驗證validateRateLimit()
:內建 API 請求速率限制範例
router.post('/register',
validateBody(schemas.userRegistration),
userController.register
);
為了提升系統的健壯性與安全性,我同時加上了一套統一的錯誤處理機制:
一致的錯誤回應格式:所有 API 都回傳統一的 JSON 結構
詳細的驗證錯誤訊息:提供欄位級的錯誤描述,方便前端呈現
安全防護:
try-catch
包裝所有業務邏輯,避免伺服器崩潰sanitizeInput()
防範 XSS透過這套三層式驗證架構與統一錯誤處理系統,整個專案的 API 變得更安全、更易維護,並且大幅減少了潛在的輸入錯誤。
接下來,我會開始將這些驗證中介層全面應用到現有的 API 路由,確保所有端點都能享有同等級的防護。