Introducción
En Node.js, la programación asíncrona es fundamental debido a su naturaleza no bloqueante. Esto permite que las operaciones de E/S (entrada/salida) no detengan la ejecución del programa mientras esperan una respuesta. En este módulo, aprenderemos sobre los callbacks, una de las formas más comunes de manejar la asincronía en Node.js.
¿Qué es un Callback?
Un callback es una función que se pasa como argumento a otra función y se ejecuta después de que la primera función ha completado su tarea. Los callbacks son una forma de asegurarse de que cierto código no se ejecute hasta que se haya completado una operación asíncrona.
Ejemplo Básico de Callback
function fetchData(callback) { setTimeout(() => { const data = { name: "John", age: 30 }; callback(data); }, 2000); } function displayData(data) { console.log("Data received:", data); } fetchData(displayData);
En este ejemplo:
fetchData
es una función que simula una operación asíncrona usandosetTimeout
.displayData
es la función callback que se ejecuta una vez quefetchData
ha completado su tarea.
Callbacks en Node.js
Node.js utiliza callbacks extensivamente para manejar operaciones asíncronas como la lectura de archivos, las solicitudes HTTP, etc.
Ejemplo de Callback en Node.js
const fs = require('fs'); fs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.error("Error reading file:", err); return; } console.log("File content:", data); });
En este ejemplo:
fs.readFile
es una función asíncrona que lee el contenido de un archivo.- El tercer argumento es una función callback que se ejecuta una vez que la operación de lectura se ha completado.
Manejo de Errores en Callbacks
Es una práctica común en Node.js que el primer argumento de un callback sea un posible error. Esto permite manejar errores de manera efectiva.
Ejemplo de Manejo de Errores
const fs = require('fs'); fs.readFile('nonexistent.txt', 'utf8', (err, data) => { if (err) { console.error("Error reading file:", err); return; } console.log("File content:", data); });
En este ejemplo:
- Si el archivo
nonexistent.txt
no existe, el callback recibe un objeto de error enerr
. - El código dentro del bloque
if (err)
maneja el error apropiadamente.
Ejercicio Práctico
Ejercicio 1: Leer y Escribir Archivos con Callbacks
- Crea un archivo llamado
input.txt
con algún contenido de texto. - Escribe un programa en Node.js que lea el contenido de
input.txt
y lo escriba en un nuevo archivo llamadooutput.txt
.
Solución
const fs = require('fs'); fs.readFile('input.txt', 'utf8', (err, data) => { if (err) { console.error("Error reading input file:", err); return; } fs.writeFile('output.txt', data, (err) => { if (err) { console.error("Error writing to output file:", err); return; } console.log("File has been written successfully."); }); });
Ejercicio 2: Realizar una Solicitud HTTP
- Utiliza el módulo
http
de Node.js para realizar una solicitud GET ahttps://jsonplaceholder.typicode.com/posts/1
. - Imprime la respuesta en la consola.
Solución
const http = require('http'); http.get('http://jsonplaceholder.typicode.com/posts/1', (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { console.log("Response received:", data); }); }).on('error', (err) => { console.error("Error making HTTP request:", err); });
Conclusión
En esta sección, hemos aprendido sobre los callbacks y su importancia en la programación asíncrona en Node.js. Los callbacks son una herramienta poderosa para manejar operaciones asíncronas, pero también pueden llevar a un código difícil de mantener si no se usan correctamente (conocido como "callback hell"). En los próximos módulos, exploraremos otras formas de manejar la asincronía, como las Promesas y async/await
.
Resumen
- Callback: Una función que se pasa como argumento a otra función y se ejecuta después de que la primera función ha completado su tarea.
- Manejo de Errores: Es común que el primer argumento de un callback sea un posible error.
- Ejemplos Prácticos: Leer y escribir archivos, realizar solicitudes HTTP.
Prepárate para el siguiente tema donde profundizaremos en los módulos y el uso de require()
en Node.js.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos