Menu
CoddyTech

עדכונים חלקיים באמצעות PATCH

חלק מהיחידה REST APIs במסלול ה-Node.js של Coddy. שיעור 3 מתוך 18.

סימון משימה כהושלמה לא אמור לדרוש שליחה חוזרת של הכותרת שלה. PATCH מעביר רק את השדות שמשתנים, והשרת משאיר את כל שאר השדות כפי שהיו.

// PATCH /api/invoices/7   { "paid": true }
const { paid, amount } = req.body ?? {};
if (paid !== undefined) invoice.paid = paid;
if (amount !== undefined) invoice.amount = amount;
res.json(invoice);

בדקו כל שדה מול undefined, ולא באמצעות if (paid): false הוא ערך שהלקוח יכול לשלוח. העתיקו את השדות בזה אחר זה במקום לפרוס את req.body על פני האובייקט, כדי שלקוח לא יוכל לשנות את id. בקשה ללא גוף משאירה את req.body במצב undefined, וזה מה ש-?? {} מטפל בו. התשובה היא 200 עם החשבונית המעודכנת כולה.

challenge icon

אתגר

קל
  • PATCH /api/tasks/:id משנה רק את השדות שהגוף שולח, title או done.
  • הוא מחזיר 200 עם המשימה כולה.
  • מזהה לא מוכר מחזיר 404 עם { "error": "Task not found" }.

שלחו PATCH /api/tasks/2 עם { "done": true }, ואז GET /api/tasks/2, ואז את אותה בקשת PATCH אל /api/tasks/99.

נסו בעצמכם

import { Router } from 'express';
import { nextId, tasks } from '../store.js';

const router = Router();

router.get('/', (req, res) => {
    res.json(tasks);
});

router.get('/:id', (req, res) => {
    const task = tasks.find((t) => t.id === Number(req.params.id));
    if (!task) {
        return res.status(404).json({ error: 'Task not found' });
    }
    res.json(task);
});

router.post('/', (req, res) => {
    const { title } = req.body ?? {};
    if (!title) {
        return res.status(400).json({ error: 'title is required' });
    }
    const task = { id: nextId(), title, done: false, createdAt: new Date().toISOString() };
    tasks.push(task);
    res.status(201).location(`/api/tasks/${task.id}`).json(task);
});

export default router;
quiz iconבחנו את עצמכם

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

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