Menu
CoddyTech

Actualizaciones parciales con PATCH

Parte de la sección API REST del Journey de Node.js de Coddy. Lección 3 de 18.

Marcar una tarea como completada no debería implicar volver a enviar su título. PATCH solo incluye los campos que cambian, y el servidor conserva todos los demás tal como estaban.

// 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);

Comprueba cada campo con undefined, no con if (paid): false es un valor que puede enviar un cliente. Copia los campos uno por uno en lugar de propagar req.body sobre el objeto, para que un cliente no pueda cambiar el id. Una solicitud sin cuerpo deja req.body como undefined, que es lo que cubre ?? {}. La respuesta es 200 e incluye la factura actualizada completa.

challenge icon

Desafío

Fácil
  • PATCH /api/tasks/:id cambia solo los campos que envía el cuerpo, title o done.
  • Responde con 200 y la tarea completa.
  • Un id desconocido responde con 404 y { "error": "Task not found" }.

Envía PATCH /api/tasks/2 con { "done": true }, después GET /api/tasks/2 y, después, el mismo PATCH a /api/tasks/99.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de API REST