Introducción: ¿por qué necesitas un cliente HTTP en Node.js?
En el desarrollo web moderno, es imposible prescindir de la interacción con servicios externos. Ya sea enviar datos a un servidor, obtener el tipo de cambio, trabajar con REST API o integrarse con plataformas en la nube, todo esto requiere la capacidad de enviar solicitudes HTTP. En el entorno Node.js, existen varios enfoques para esto: desde el módulo incorporado http hasta bibliotecas de terceros populares como axios y el nativo fetch.
En este artículo, analizaremos cómo organizar correctamente un cliente HTTP en JavaScript (Node.js), qué herramientas elegir para diferentes tareas y cómo evitar errores típicos. Aprenderás cómo manejar respuestas, gestionar la asincronía y escribir código limpio y mantenible.
Formas principales de crear solicitudes HTTP en Node.js
Node.js ofrece al desarrollador varias opciones para trabajar con HTTP. Veamos tres principales: el módulo incorporado http, la biblioteca axios y el nativo fetch.
1. Módulo incorporado http/https
Es la forma de más bajo nivel. Te da control total sobre la solicitud, pero requiere escribir más código. Es adecuado para casos donde necesitas minimizar dependencias o trabajar con protocolos no estándar.
Ejemplo de una solicitud GET usando el módulo https:
const https = require('https');
function getUsers() { return new Promise((resolve, reject) => { https.get('https://jsonplaceholder.typicode.com/users', (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => resolve(JSON.parse(data))); }).on('error', reject); });}
getUsers().then(users => console.log(users[0].name));Ventajas: sin dependencias externas, control total.
Desventajas: código verboso, necesidad de envolver en Promise, gestión manual de flujos.
2. Biblioteca axios
Es la biblioteca más popular para solicitudes HTTP. Funciona tanto en el navegador como en Node.js. Soporta Promise, interceptores (interceptors), análisis JSON automático y cancelación de solicitudes.
Instalación:
npm install axiosEjemplo de una solicitud POST con axios:
const axios = require('axios');
async function createPost() { try { const response = await axios.post('https://jsonplaceholder.typicode.com/posts', { title: 'Cliente HTTP en JavaScript', body: 'Haciendo solicitudes correctamente', userId: 1 }); console.log('Post creado:', response.data); } catch (error) { console.error('Error:', error.message); }}
createPost();Ventajas: API simple, manejo automático de JSON, interceptores, timeouts.
Desventajas: requiere instalación, tamaño de la biblioteca (~14 KB gzip).
3. Nativo fetch (Node.js 18+)
A partir de la versión Node.js 18, fetch se convirtió en una función incorporada. Esto unifica el código entre el navegador y el servidor. Sin embargo, en versiones antiguas de Node.js se necesitará un polyfill.
Ejemplo con fetch y async/await:
async function getUser(id) { const response = await fetch(`https://jsonplaceholder.typicode.com/users/${id}`); if (!response.ok) { throw new Error(`Error HTTP! estado: ${response.status}`); } const user = await response.json(); return user;}
getUser(1).then(user => console.log(user.name));Ventajas: nativo, no requiere instalación, API moderna.
Desventajas: no soportado en Node.js < 18, sin timeout incorporado, requiere verificación manual del estado.
Manejo correcto de errores y timeouts
Uno de los problemas más comunes al trabajar con clientes HTTP es ignorar el manejo de errores. La red no es confiable, el servidor puede responder con un error 500 o no responder en absoluto.