Kodokon kodokon.com

Tu primer servidor HTTP nativo

Creas un servidor web con el módulo http de Node, respondes a las solicitudes y devuelves JSON.

10 min · 3 preguntas

Abrir esta lección en Kodokon

Un servidor web es un programa que se ejecuta de forma continua y espera solicitudes: peticiones enviadas por un cliente (un navegador, una app móvil, etc.). Por cada solicitud, devuelve una respuesta. Este diálogo sigue el protocolo HTTP, el lenguaje común de la web. Node incluye un módulo http listo para usar: no hay nada que instalar. Una última noción: el puerto, un número que identifica un programa concreto en una máquina, como el número de un apartamento en un edificio. Usaremos el puerto 3000; en cuanto a localhost, designa simplemente tu propia máquina.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello from my server!");
});

server.listen(3000, () => {
  console.log("Server at http://localhost:3000");
});
Guarda este código en server.js y luego ejecuta node server.js.

Desglosémoslo. http.createServer recibe una función que se llama en cada solicitud, con dos parámetros: req (la solicitud entrante) y res (la respuesta que se está construyendo). res.statusCode = 200 establece el código de estado - 200 significa "todo bien". res.setHeader añade una cabecera, un dato de metadatos sobre la respuesta: aquí su formato, texto plano. res.end envía la respuesta y la cierra. Por último, server.listen(3000) pone el servidor a la escucha en el puerto 3000. Abre http://localhost:3000 en tu navegador: aparece tu texto. Fíjate en que el programa no devuelve el control: espera solicitudes. Detenlo con Ctrl+C.

Los servidores modernos rara vez devuelven texto plano: exponen APIs que responden en JSON, ese formato de texto que ya conoces, comprendido por todos los lenguajes. Dos ajustes: la cabecera Content-Type pasa a ser application/json, y el objeto de JavaScript se convierte en texto con JSON.stringify. Aprovechemos para reaccionar de forma diferente según req.url, la ruta solicitada por el cliente: esta es la base del enrutamiento.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.setHeader("Content-Type", "application/json");

  if (req.url === "/api/message") {
    const body = { message: "Hello!", ok: true };
    res.statusCode = 200;
    res.end(JSON.stringify(body));
    return;
  }

  res.statusCode = 404;
  res.end(JSON.stringify({ error: "Not found" }));
});

server.listen(3000, () => {
  console.log("http://localhost:3000/api/message");
});
Una ruta conocida responde 200 con un objeto JSON; cualquier otra ruta recibe un 404.

El código de estado 404 significa "no encontrado": la ruta solicitada no coincide con ninguna ruta conocida. Fíjate en el return después de la primera respuesta: impide que el código continúe y envíe una segunda respuesta, lo que provocaría un error. Para probar, abre la dirección en el navegador, o usa curl, una herramienta de línea de comandos que envía solicitudes HTTP y muestra la respuesta en la terminal.

BASH
curl http://localhost:3000/api/message
En una segunda terminal, mientras el servidor está en marcha: aparece la respuesta JSON.

Prueba de conocimientos

Comprueba que has retenido los puntos clave de esta lección.

  1. ¿Qué hace server.listen(3000)?
    • Pone el servidor a la escucha de solicitudes en el puerto 3000
    • Envía una solicitud al puerto 3000
    • Limita el servidor a 3000 solicitudes simultáneas
    • Abre el navegador en localhost:3000
  2. ¿Qué cabecera envías para indicar que la respuesta es JSON?
    • Accept: application/json
    • Content-Type: application/json
    • Format: json
  3. ¿Por qué pasar el objeto por JSON.stringify antes de res.end?
    • Para comprimir la respuesta y ahorrar tiempo
    • Para comprobar que el objeto no contiene ningún error
    • Porque una respuesta HTTP transporta texto, no un objeto de JavaScript