Crear un servidor web HTTP en Node.js con Code Ejemplo

⚡ Resumen inteligente

Node.js crea un servidor web funcional en pocas líneas utilizando el módulo http integrado. El servidor escucha en un puerto elegido y responde a cada solicitud con un código de estado y un cuerpo de la respuesta, mientras que un código independiente obtiene datos de otros sitios.

  • 🖥️ Creación del servidor: http.createServer registra una función de devolución de llamada que se ejecuta una vez por cada solicitud entrante y recibe objetos de solicitud y respuesta.
  • 🔢 Estado y encabezados: writeHead envía el código de estado y el Content-Type antes de que se escriba cualquier contenido del cuerpo.
  • ???? Enlace de puerto: server.listen conecta la aplicación a un puerto, y se puede elegir cualquier número de puerto disponible.
  • 📥 Solicitudes salientes: Para obtener datos de otro sitio se necesita un cliente HTTP, y Node ahora incluye una función de obtención global.
  • ⚠️ Cliente obsoleto: El módulo de solicitudes quedó obsoleto en febrero de 2020 y no debe utilizarse en código nuevo.
  • 🛠️ Fallos de inicio: Un error EADDRINUSE significa que el puerto elegido ya está siendo utilizado por otro proceso.

Crear un servidor web HTTP en Node.js

El Node.js El framework se utiliza principalmente para crear aplicaciones basadas en servidor. Se puede usar fácilmente para construir servidores web que distribuyan contenido a los usuarios.

Varios módulos manejan las solicitudes relacionadas con el servidor, el integrado http El módulo principal entre ellos. Veremos cómo crear una aplicación básica de servidor web usando Node.js, y luego cómo solicitar datos de otro sitio.

Nodo como servidor web usando HTTP

Veamos un ejemplo de cómo crear y ejecutar una primera aplicación Node.js.

La aplicación crea un módulo de servidor simple que escucha en el puerto 7000. Cuando se realiza una solicitud a través del navegador en ese puerto, el servidor envía un Hola Mundo respuesta al cliente.

Nodo como servidor web usando HTTP

Code Explicación

  1. El require La función lee un JavaScript archivo, lo ejecuta y devuelve su objeto de exportaciones. Aquí carga el http módulo para que su funcionalidad esté disponible en la aplicación.
  2. Una aplicación de servidor se crea a partir de una función simple. Esa función se ejecuta cada vez que una solicitud llega al servidor.
  3. Cuando se recibe una solicitud, la respuesta se envía con un estado de 200Este es el código de estado estándar en un encabezado HTTP para una respuesta exitosa.
  4. El cuerpo de la respuesta en sí es la cadena Hola Mundo.
  5. server.listen Hace que la aplicación escuche las solicitudes de los clientes en el puerto 7000. Se puede utilizar cualquier puerto disponible.

Si el comando se ejecuta correctamente, aparecerá la siguiente salida en el navegador.

Resultado

Salida del servidor web Node

Según la salida:

  • Navegando al host local URL en el puerto 7000 se muestra la cadena Hola Mundo en la página.
  • Dado que el código especifica el puerto 7000, la salida solo es visible al navegar a ese puerto.

Aquí está el código como referencia:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

Manejo de solicitudes GET en Node.js

Realizar una solicitud GET para recuperar datos de otro sitio es sencillo en Node.js. Históricamente, esto requería la request Módulo instalado desde la línea de comandos:

npm install request

Ese comando le pide al gestor de paquetes de Node que descargue el módulo necesario y lo instale. Cuando la instalación se realiza correctamente, la línea de comandos muestra el nombre y la versión del módulo instalado en el formato <name>@<version>.

Salida de la solicitud de instalación de npm

En la instantánea de arriba, el request El módulo y su número de versión fueron descargados e instalados.

Cómo realizar una solicitud GET en Node.js

Code Explicación

  1. El request El módulo instalado en el paso anterior proporciona las funciones necesarias para realizar solicitudes GET a sitios web.
  2. Se realiza una solicitud GET a un sitio web y se ejecuta una función de devolución de llamada una vez que llega la respuesta. Esta función recibe tres parámetros:
    1. Error — registra cualquier error que se produzca al realizar la solicitud.
    2. Respuesta — contiene los encabezados HTTP devueltos con la respuesta.
    3. Carrocería — contiene todo el contenido de la respuesta.
  3. El contenido recibido en el body El parámetro se escribe en la consola.

Aquí está el código como referencia:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ Aviso de descontinuación: <font dir="auto" style="vertical-align: inherit;">las </font> request El módulo era Completamente obsoleto en febrero de 2020. y no recibe más actualizaciones. Todavía se instala y se ejecuta, por lo que el ejemplo anterior sigue siendo válido para los proyectos existentes, pero npm install request ahora imprime una advertencia de obsolescencia. El nuevo código debería usar el integrado fetch La función se muestra en la siguiente sección.

Cómo realizar solicitudes HTTP con la función fetch nativa en Node.js

Node ha incluido una función global fetch Funciona desde la versión 18, coincidiendo con la API que ya proporcionan los navegadores. No se requiere la instalación de ningún paquete y la función devuelve una promesa, por lo que funciona directamente con async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

Hay tres diferencias con respecto al estilo de devolución de llamada que vale la pena destacar. Primero, fetch Los rechazos se producen únicamente en caso de fallo a nivel de red; un error HTTP 404 o 500 se resuelve correctamente, por lo que el response.ok La verificación existe y por qué omitirla es el error más común al pasar de request. Segundo, el cuerpo no se entrega con la respuesta; debe leerse explícitamente con response.text() para texto sin formato o response.json() para JSON, y cada uno de ellos devuelve su propia promesa. En tercer lugar, debido a que toda la llamada se basa en promesas, una sola try/catch Cubre tanto la solicitud como el cuerpo leído, reemplazando por completo el parámetro de devolución de llamada de error-first.

Para los scripts que deben ejecutarse en Node 16 o anterior, instale node-fetch or axios En cambio, dado que ambos exponen una interfaz comparable basada en promesas y solo requieren un cambio en la línea de importación una vez que se actualiza el entorno de ejecución.

request vs fetch vs axios: ¿Cuál usar?

En la mayoría de los materiales de Node aparecen tres clientes HTTP, pero solo uno de ellos es una opción predeterminada recomendable para proyectos nuevos. Se diferencian en su estado de mantenimiento, en si requieren o no dependencias y en cómo indican los errores, por lo que la siguiente tabla los compara.

Aspecto solicita obtener (integrado) axios
Estado Obsoleto desde 2020 Mantenido en el núcleo Mantenido activamente
Instalación paquete npm Ninguno en Node 18+ paquete npm
DE ESTILO RESORT devolución de llamada de error primero Promesa Promesa
análisis JSON Manual o una opción JSON Manual a través de response.json() Automático
Rechazos en 404 o 500 No No Sí:

Usar fetch Para nuevos proyectos en una versión actual de Node, ya que no agrega ninguna dependencia y coincide con la API del navegador que los desarrolladores ya conocen. Elija axios cuando el manejo automático de JSON, los interceptores de solicitudes o el rechazo en estados de error ahorrarían código real. Mantener request solo dentro de aplicaciones heredadas que ya dependen de él y planean reemplazarlo.

Errores comunes del servidor Node.js y cómo solucionarlos

La mayoría de los fallos al iniciar un servidor Node por primera vez se deben a problemas con los puertos, las rutas o la falta de respuesta, y no al código del servidor en sí.

  • EADDRINUSE: Otro proceso ya tiene el puerto ocupado. Ejecutar netstat -ano | findstr :7000 on Windows, o lsof -i :7000 on macOS y Linux, entonces detenga ese proceso o elija un puerto diferente.
  • EACCES en un puerto bajo: Los puertos inferiores a 1024 requieren privilegios elevados. Durante el desarrollo, utilice un puerto superior a 1024, como el 3000 o el 7000.
  • El navegador se bloquea y nunca carga: El encargado nunca llamó response.end()La conexión permanece abierta hasta que expira el tiempo de espera, por lo que cada ruta a través del controlador debe finalizar la respuesta.
  • No se puede encontrar el módulo 'http': El nombre del archivo está mal escrito o el script se está ejecutando en un navegador en lugar de en Node. Los módulos principales no necesitan instalación.
  • Los cambios no aparecen: Node carga el archivo una vez al inicio. Reinicie el proceso después de cada edición o ejecútelo bajo un observador como node --watch server.js.

Preguntas Frecuentes

El módulo http es suficiente para un único punto final. Express añade enrutamiento, middleware y análisis del cuerpo de la solicitud, lo que justifica la dependencia una vez que una aplicación gestiona varias rutas.

Requerir el https En su lugar, utilice el módulo y pase una clave y un certificado a createServer. En producción, un proxy inverso como Nginx normalmente termina TLS y reenvía HTTP simple a Node.

Sí. AI Las herramientas convierten de forma fiable las devoluciones de llamada con manejo de errores en async/await. Comprueba que el código generado incluya una prueba de response.ok, ya que fetch se resuelve con un error 404 y esta comprobación suele omitirse.

Los asistentes de IA leen el código de error e identifican directamente la causa, distinguiendo un conflicto de puertos de un problema de permisos o un fallo de sintaxis, lo que reduce considerablemente el tiempo de indecisión en un primer proyecto de Node.

El objeto de solicitud es un flujo de datos, por lo que se recopilan sus eventos de datos en un búfer y se analiza el resultado en el evento final. Express y frameworks similares proporcionan middleware de análisis del cuerpo que realiza este paso automáticamente.

Resumir este post con: