Menu
CoddyTech

מבנה שגיאה אחיד

חלק מהיחידה 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');
challenge icon

אתגר

קל

ה־API שלך שולח עכשיו שגיאות בשתי צורות: מחרוזת פשוטה עבור 404, ואובייקט של zod עבור 400. תן לכל השגיאות אותה צורה, כדי שלקוח יוכל לקרוא את כולן באותו אופן. מעכשיו כל שגיאה נראית כך, כאשר fields מתווסף רק כשיש מה לרשום:

{ "error": { "code": "not_found", "message": "Task not found" } }
  1. בקובץ errors.js, השלם את sendError(res, status, code, message, fields). היא משיבה עם הסטטוס הנתון ועם המבנה שלמעלה. הוסף את fields לאובייקט הפנימי רק אם הארגומנט הזה ניתן. sendInvalid, שמופיעה אחריה, כבר כתובה וקוראת לפונקציה שלך.
  2. בקובץ 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"] }
      }
    }
  3. בקובץ server.js, ייבא את sendError והשתמש בה במטפל השגיאות שבתחתית הקובץ:
    • גוף בקשה שאינו JSON תקין יקבל סטטוס 400, קוד invalid_json והודעה The body is not valid JSON.
    • כל דבר אחר יקבל סטטוס 500, קוד server_error והודעה Something went wrong.

נסה זאת: הבקשה 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);
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה REST APIs

תרגלו בעצמכם: Express אונליין