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: