Módulo HTTP de Node.js

¿Qué es el Módulo HTTP?

Es un módulo nativo de Node.js para crear servidores web y hacer solicitudes HTTP.

javascript
const http = require('http');
const https = require('https');
const url = require('url');
const fs = require('fs');

2. Creación de un Servidor HTTP Básico

Crea un servidor HTTP en Node.js que maneja peticiones GET y POST. Para las peticiones GET, devuelve un mensaje o una lista de usuarios, mientras que para las POST procesa los datos recibidos y responde con un mensaje de confirmación o error. Utiliza el módulo http de Node.js y realiza el enrutamiento basado en la URL y el método de la petición.

javascript
const servidor = http.createServer((req, res) => {
  // Manejo de diferentes rutas y métodos
  switch(req.method) {
      case 'GET':
          // Enrutamiento básico
          switch(req.url) {
              case '/':
                  res.writeHead(200, { 'Content-Type': 'application/json' });
                  res.end(JSON.stringify({ mensaje: 'Inicio del servidor' }));
                  break;
              case '/usuarios':
                  const usuarios = [
                      { id: 1, nombre: 'Juan' },
                      { id: 2, nombre: 'María' }
                  ];
                  res.writeHead(200, { 'Content-Type': 'application/json' });
                  res.end(JSON.stringify(usuarios));
                  break;
              default:
                  res.writeHead(404, { 'Content-Type': 'text/plain' });
                  res.end('Ruta no encontrada');
          }
          break;
      
      case 'POST':
          let cuerpo = '';
          req.on('data', chunk => {
              cuerpo += chunk.toString();
          });
          req.on('end', () => {
              try {
                  const datos = JSON.parse(cuerpo);
                  res.writeHead(201, { 'Content-Type': 'application/json' });
                  res.end(JSON.stringify({ 
                      mensaje: 'Datos recibidos', 
                      datosRecibidos: datos 
                  }));
              } catch (error) {
                  res.writeHead(400, { 'Content-Type': 'text/plain' });
                  res.end('Error en los datos');
              }
          });
          break;
  }
});

3. Configuración de Puertos y Escucha

Este código configura el puerto del servidor, utilizando el valor de la variable de entorno PORT o 3000 por defecto. Luego, inicia el servidor y muestra un mensaje en consola indicando que está corriendo en el puerto especificado.

javascript
const PUERTO = process.env.PORT || 3000;
servidor.listen(PUERTO, () => {
  console.log(`Servidor corriendo en http://localhost:${PUERTO}`);
});

4. Realizar Solicitudes HTTP con Node.js

Se define una función que realiza una solicitud HTTP GET usando el módulo https de Node.js, y devuelve una promesa que resuelve los datos recibidos o rechaza un error. Los datos se parsean a JSON al finalizar la solicitud.

javascript
function realizarSolicitudGet(urlDestino) {
  return new Promise((resolve, reject) => {
      https.get(urlDestino, (res) => {
          let datos = '';
          
          res.on('data', (chunk) => {
              datos += chunk;
          });
          
          res.on('end', () => {
              try {
                  const datosParseados = JSON.parse(datos);
                  resolve(datosParseados);
              } catch (error) {
                  reject(error);
              }
          });
      }).on('error', (error) => {
          reject(error);
      });
  });
}

5. Ejemplo de Middleware de Seguridad

Se define un middleware de seguridad que verifica si la solicitud incluye un token de autorización en los encabezados. Si el token no está presente, responde con un error 401, de lo contrario, pasa al siguiente middleware o ruta.

javascript
function middlewareSeguridad(req, res, next) {
  // Ejemplo de validación de headers
  const tokenAutorizacion = req.headers['authorization'];
  
  if (!tokenAutorizacion) {
      res.writeHead(401, { 'Content-Type': 'application/json' });
      res.end(JSON.stringify({ error: 'No autorizado' }));
      return;
  }
  
  // Continuar con la solicitud
  next();
}

6. Manejo de Errores Avanzado

Maneja errores no controlados en Node.js, capturándolos y registrándolos en la consola para realizar acciones de limpieza o registro.

javascript
process.on('uncaughtException', (error) => {
  console.error('Error no controlado:', error);
  // Realizar acciones de limpieza o registro
});

Funciones de Utilidad

Esta función parsearURL utiliza el módulo url de Node.js para analizar una URL completa y devolver un objeto con los componentes de la URL.

javascript
function parsearURL(urlCompleta) {
  return url.parse(urlCompleta, true);
}

Ejemplo de Exportación de Módulos

Código exporta varias funciones y métodos, permitiendo su uso en otros archivos de Node.js, incluyendo crearServidor, realizarSolicitudGet, middlewareSeguridad y parsearURL.

javascript
module.exports = {
  crearServidor: http.createServer,
  realizarSolicitudGet,
  middlewareSeguridad,
  parsearURL
};