Menu
CoddyTech

Crear con POST

Parte de la sección API REST del Journey de Node.js de Coddy. Lección 2 de 25.

Un cliente que añade una tarea necesita saber dónde se encuentra la nueva tarea. Envía el nuevo recurso a la URL de la lista con POST, y el servidor responde 201 Creado con el recurso y un encabezado Location que indica su URL.

POST /api/events   { "name": "Launch party" }

201 Created
Location: /api/events/12
{ "id": 12, "name": "Launch party" }

El servidor elige el id, así que dos clientes nunca pueden reclamar el mismo. Con el encabezado Location, el cliente puede obtener el nuevo evento sin construir la URL por sí mismo. res.location(path) establece ese encabezado y se encadena como res.status:

res.status(201).location(`/api/events/${event.id}`).json(event);
challenge icon

Desafío

Fácil

Los clientes necesitan una forma de añadir tareas. Añade una ruta POST que cree una tarea e indique al cliente dónde se encuentra la nueva tarea.

  1. En routes/tasks.js, añade una ruta para POST /api/tasks (dentro del enrutador, esa ruta es '/'). Lee title del cuerpo JSON, por ejemplo { "title": "Order new chairs" }.
  2. Crea la nueva tarea con cuatro campos:
    • id: de la función nextId() en store.js. Impórtala junto a tasks.
    • title: del cuerpo.
    • done: false.
    • createdAt: new Date().toISOString(), la hora actual como texto.

    Añádela al arreglo tasks, para que GET /api/tasks también la muestre.

  3. Responde con el estado 201 y la nueva tarea como JSON. Establece el encabezado Location en la URL propia de la tarea: para la tarea 4, es /api/tasks/4. En una ejecución nueva, el cuerpo de la respuesta se ve así (tu createdAt será el momento en que la envíes):
    { "id": 4, "title": "Order new chairs", "done": false, "createdAt": "2026-10-30T09:12:44.512Z" }
  4. Cuando el cuerpo no tenga title, responde con el estado 400 y { "error": "title is required" }, y no añadas nada a la lista.

Pruébalo: elige POST, la ruta /api/tasks y el cuerpo { "title": "Order new chairs" }. Deberías ver 201 y la tarea de arriba con id 4, y la pestaña Headers de la respuesta muestra Location: /api/tasks/4. Envía GET /api/tasks/4: recibirás la misma tarea. Después, envía POST {} a /api/tasks: recibirás 400 con el error, y GET /api/tasks seguirá mostrando 4 tareas, porque el POST rechazado no añadió nada.

Pruébalo tú mismo

import { Router } from 'express';
import { 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);
});

export default router;

Todas las lecciones de API REST

Practica por tu cuenta: Playground de Express