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:
- Enviar una petición
POST /userscon datos JSON. - Leer y procesar esos datos en el servidor.
- Generar identificadores únicos (IDs) de forma segura.
- 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
- Cliente: Envía
POST /usuarioscon{ "name": "Midu" }. - Servidor: Detecta el método
POSTy la ruta. - Servidor: Consume el stream del body y lo convierte a objeto.
- Servidor: Valida que el nombre exista.
- Servidor: Genera un
UUIDy guarda el objeto en el array. - Servidor: Responde con un
201y el nuevo usuario creado.
Nota: Como estamos guardando los datos en un array en memoria, si reinicias el servidor (
npm run devo 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!