¡Ven a la JSConf España 2026! Comprar entradas

Crear usuarios con POST en una API Node.js

Hasta ahora nuestra API solo devolvía datos (operaciones de lectura). En esta clase damos un paso clave: permitir crear recursos mediante una petición POST.

Vamos a hacerlo con Node.js puro, sin Express ni librerías externas, para entender perfectamente el flujo de datos desde que llegan al servidor hasta que se procesan.


Objetivo de la clase

Al finalizar esta clase, serás capaz de:

  1. Enviar una petición POST /users con datos JSON.
  2. Leer y procesar esos datos en el servidor.
  3. Generar identificadores únicos (IDs) de forma segura.
  4. Responder con el código de estado adecuado (201 Created).

Separar lógica por método HTTP

Como vimos en la clase anterior, una misma URL puede comportarse de forma distinta según el método. Para nuestro recurso de usuarios:

  • GET /usuarios: Devuelve la lista de usuarios.
  • POST /usuarios: Crea un nuevo usuario.
if (url === '/usuarios') {
  if (method === 'GET') {
    return res.end(JSON.stringify(users))
  }

  if (method === 'POST') {
    // Aquí irá nuestra lógica de creación
  }
}

El “problema” del Body en Node.js nativo

Aunque desde el cliente (Postman, Bruno, etc.) enviamos un JSON, Node.js no lo recibe como un objeto mágico.

El cuerpo de la petición (body) llega como un Stream de datos (pedazos de bytes). Para poder trabajar con él, debemos esperar a que lleguen todos los trozos y unirlos.

Leer el body en una sola línea

Afortunadamente, Node.js moderno incluye utilidades en el módulo node:stream/consumers que nos permiten hacer esto de forma muy sencilla usando async/await.

import { json } from 'node:stream/consumers'

// ... dentro del createServer
if (method === 'POST') {
  try {
    const body = await json(req) // 👈 Lee el stream y lo convierte a objeto JSON
    const { name } = body
    // ...
  } catch (error) {
    res.statusCode = 400
    return res.end('Invalid JSON')
  }
}

Validar y generar IDs únicos

Antes de guardar al usuario, debemos asegurarnos de que los datos son correctos. Además, el ID nunca debe venir del cliente; es responsabilidad del servidor asegurar su unicidad.

Para generar IDs seguros sin librerías externas como uuid, Node.js nos ofrece el módulo node:crypto.

import crypto from 'node:crypto'

// ...
if (!name) {
  res.statusCode = 400
  return res.end(JSON.stringify({ message: 'Name is required' }))
}

const newUser = {
  id: crypto.randomUUID(), // 👈 Genera un ID tipo "550e8400-e29b-41d4-a716-446655440000"
  name,
}

users.push(newUser) // Guardamos en nuestro array en memoria

Devolver la respuesta correcta

Cuando creamos un recurso con éxito, el estándar HTTP dicta que debemos responder con un código 201 Created.

res.statusCode = 201
res.setHeader('Content-Type', 'application/json')
return res.end(JSON.stringify(newUser))

Resumen del flujo completo

  1. Cliente: Envía POST /usuarios con { "name": "Midu" }.
  2. Servidor: Detecta el método POST y la ruta.
  3. Servidor: Consume el stream del body y lo convierte a objeto.
  4. Servidor: Valida que el nombre exista.
  5. Servidor: Genera un UUID y guarda el objeto en el array.
  6. Servidor: Responde con un 201 y el nuevo usuario creado.

Nota: Como estamos guardando los datos en un array en memoria, si reinicias el servidor (npm run dev o el watch mode), los usuarios creados desaparecerán. Esto es normal hasta que aprendamos a usar bases de datos.


Conclusión

Manejar peticiones POST de forma nativa te da una comprensión profunda de cómo viaja la información en la web. Has aprendido a trabajar con streams, validaciones y códigos de estado específicos de creación.

¡En la próxima clase veremos cómo persistir estos datos o empezar a usar herramientas que simplifiquen este proceso!