Saltar al contenido principal

Acceso a recursos externos en Node.js

Node.js permite acceder a datos o archivos alojados en servidores remotos a través de HTTP o HTTPS. Esto es útil para consumir APIs, descargar archivos o integrar información externa en una aplicación.

Se recomienda usar fetch, función que está disponible nativamente a partir de Node 18+, o bibliotecas externas como axios.

Usando fetch

Ejemplo básico GET

import fetch from 'node-fetch'; // Solo necesario si Node <18

const url = 'https://api.example.com/usuarios';

try {
const respuesta = await fetch(url);
if (!respuesta.ok) throw new Error(`Error HTTP: ${respuesta.status}`);

const datos = await respuesta.json();
console.log('Datos obtenidos:', datos);
} catch (err) {
console.error('Error al descargar los datos:', err);
}

Ejemplo POST con cabeceras y JSON

const url = 'https://api.example.com/usuarios';
const nuevoUsuario = {
nombre: 'Carlos',
email: 'carlos@example.com'
};

try {
const respuesta = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer TU_TOKEN_AQUI'
},
body: JSON.stringify(nuevoUsuario)
});

const resultado = await respuesta.json();
console.log('Respuesta del servidor:', resultado);
} catch (err) {
console.error('Error en la solicitud POST:', err);
}

Descarga de archivos

Para descargar archivos binarios (por ejemplo, imágenes) se puede usar fetch con arrayBuffer:

import fs from 'fs/promises';

const url = 'https://example.com/imagen.jpg';

try {
const respuesta = await fetch(url);
if (!respuesta.ok) throw new Error(`Error HTTP: ${respuesta.status}`);

const buffer = await respuesta.arrayBuffer();
await fs.writeFile('imagen.jpg', Buffer.from(buffer));
console.log('Imagen descargada correctamente');
} catch (err) {
console.error('Error al descargar la imagen:', err);
}

Usando Axios

Axios es una biblioteca HTTP basada en promesas que simplifica el consumo de APIs y la descarga de recursos. Se instala con:

npm install axios

Ejemplo básico GET

import axios from 'axios';

try {
const respuesta = await axios.get('https://api.example.com/usuarios');
console.log('Datos obtenidos con Axios:', respuesta.data);
} catch (err) {
console.error('Error al descargar los datos con Axios:', err);
}

Ejemplo POST con JSON y cabeceras

const nuevoUsuario = {
nombre: 'Laura',
email: 'laura@example.com'
};

try {
const respuesta = await axios.post(
'https://api.example.com/usuarios',
nuevoUsuario,
{
headers: {
'Authorization': 'Bearer TU_TOKEN_AQUI'
}
}
);

console.log('Respuesta del servidor con Axios:', respuesta.data);
} catch (err) {
console.error('Error en la solicitud POST con Axios:', err);
}

Descarga de archivos binarios con Axios

import fs from 'fs/promises';
import axios from 'axios';

try {
const respuesta = await axios.get('https://example.com/imagen.jpg', { responseType: 'arraybuffer' });
await fs.writeFile('imagen_descargada.jpg', respuesta.data);
console.log('Archivo binario descargado correctamente con Axios');
} catch (err) {
console.error('Error al descargar archivo con Axios:', err);
}

Buenas prácticas

  • Usar HTTPS para proteger la información en tránsito.
  • Manejar errores de red y respuestas inválidas con try/catch.
  • Configurar tiempos de espera (timeout) para evitar que la aplicación quede bloqueada.
  • Evitar descargar grandes volúmenes de datos en memoria; usar streams si es necesario.
  • Sanitizar los datos recibidos antes de procesarlos o guardarlos.