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.