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.
Desafío
FácilPATCH /api/tasks/:idcambia solo los campos que envía el cuerpo,titleodone.- 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;
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de API REST
1Recursos y verbos
Recursos y URLCrear con POST