מבנה שגיאה אחיד
חלק מהיחידה REST APIs במסלול ה-Node.js של Coddy. שיעור 12 מתוך 25.
ה-API שלך מחזיר עכשיו שגיאות בשתי צורות: מחרוזת עבור 404 ואובייקט של zod עבור 400. לקוח צריך לטפל בכל אחת מהן. בחר צורה אחת לכל שגיאה:
{ "error": { "code": "not_found", "message": "Invoice not found" } }
{ "error": { "code": "invalid_body", "message": "Too small: ...",
"fields": { "amount": ["Too small: expected number to be >0"] } } }code מיועד לתוכניות: הוא לעולם לא משתנה, ולכן לקוח יכול להשוות אותו. message מיועד לאנשים, והניסוח שלו עשוי להשתנות. fields מציין לטופס איזה קלט לסמן. כתוב את המבנה בפונקציה אחת וקרא לה מכל נתיב, כדי שאף נתיב לא יסטה:
sendError(res, 404, 'not_found', 'Invoice not found');אתגר
קלה־API שלך שולח עכשיו שגיאות בשתי צורות: מחרוזת פשוטה עבור 404, ואובייקט של zod עבור 400. תן לכל השגיאות אותה צורה, כדי שלקוח יוכל לקרוא את כולן באותו אופן. מעכשיו כל שגיאה נראית כך, כאשר fields מתווסף רק כשיש מה לרשום:
{ "error": { "code": "not_found", "message": "Task not found" } }- בקובץ
errors.js, השלם אתsendError(res, status, code, message, fields). היא משיבה עם הסטטוס הנתון ועם המבנה שלמעלה. הוסף אתfieldsלאובייקט הפנימי רק אם הארגומנט הזה ניתן.sendInvalid, שמופיעה אחריה, כבר כתובה וקוראת לפונקציה שלך. - בקובץ
routes/tasks.js, ייבא את שתי פונקציות העזר:- החלף את ארבע התגובות מסוג 404 (עבור GET, PATCH, PUT ו־DELETE של משימה אחת) ב־
sendError, עם הקודnot_foundוההודעהTask not found. - החלף את שלוש התגובות מסוג 400 עבור גוף בקשה לא תקין (POST, PATCH ו־PUT) ב־
sendInvalid(res, result.error).
גוף בקשה לא תקין נראה כך (zod כותב את ההודעה):
{ "error": { "code": "invalid_body", "message": "Invalid input: expected string, received number", "fields": { "title": ["Invalid input: expected string, received number"] } } } - החלף את ארבע התגובות מסוג 404 (עבור GET, PATCH, PUT ו־DELETE של משימה אחת) ב־
- בקובץ
server.js, ייבא אתsendErrorוהשתמש בה במטפל השגיאות שבתחתית הקובץ:- גוף בקשה שאינו JSON תקין יקבל סטטוס 400, קוד
invalid_jsonוהודעהThe body is not valid JSON. - כל דבר אחר יקבל סטטוס 500, קוד
server_errorוהודעהSomething went wrong.
- גוף בקשה שאינו JSON תקין יקבל סטטוס 400, קוד
נסה זאת: הבקשה DELETE /api/tasks/99 מחזירה 404 עם { "error": { "code": "not_found", "message": "Task not found" } }, ובלי fields. שלח POST עם { "title": 123 } אל /api/tasks: תקבל 400 עם השגיאה invalid_body שמופיעה למעלה. סרגל הבקשות מסרב לשלוח JSON פגום, ולכן הבדיקות בודקות עבורך את המקרה invalid_json.
נסו בעצמכם
import { z } from 'zod';
// שולח כל שגיאה במבנה אחיד:
// { "error": { "code": "not_found", "message": "Task not found" } }
// כאשר "fields" נוסף רק אם הוא סופק.
export const sendError = (res, status, code, message, fields) => {
// שלחו את התשובה כאן
};
// שגיאת zod בתור 400: הבעיה הראשונה שלה משמשת כהודעה, והבעיות של כל שדה
// מופיעות ב־fields.
export const sendInvalid = (res, zodError) =>
sendError(res, 400, 'invalid_body', zodError.issues[0].message, z.flattenError(zodError).fieldErrors);
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה REST APIs
תרגלו בעצמכם: Express אונליין