صيغة موحّدة للأخطاء
جزء من قسم واجهات REST API في رحلة Node.js على Coddy. الدرس 8 من 18.
تُرجع واجهة 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');التحدي
سهل- اكتب
sendErrorفيerrors.js:{ "error": { "code", "message" } }مع الحالة، بالإضافة إلىfieldsفقط عند توفيره. - استخدمه لكل حالات 404 (الرمز
not_found)، واستخدمsendInvalidلكل متن غير صالح، وsendErrorفي معالج الأخطاء فيserver.js(invalid_json،server_error).
أرسل DELETE /api/tasks/99، ثم أرسل POST مع { "title": 123 }.
جرّب بنفسك
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);
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.