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 usando setTimeout.
  • displayData es la función callback que se ejecuta una vez que fetchData 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 en err.
  • El código dentro del bloque if (err) maneja el error apropiadamente.

Ejercicio Práctico

Ejercicio 1: Leer y Escribir Archivos con Callbacks

  1. Crea un archivo llamado input.txt con algún contenido de texto.
  2. Escribe un programa en Node.js que lea el contenido de input.txt y lo escriba en un nuevo archivo llamado output.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

  1. Utiliza el módulo http de Node.js para realizar una solicitud GET a https://jsonplaceholder.typicode.com/posts/1.
  2. 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

Módulo 5: NPM y Gestión de Paquetes

Módulo 6: Framework Express.js

Módulo 7: Bases de Datos y ORMs

Módulo 8: Autenticación y Autorización

Módulo 9: Pruebas y Depuración

Módulo 10: Temas Avanzados

Módulo 11: Despliegue y DevOps

Módulo 12: Proyectos del Mundo Real

© Copyright 2024. Todos los derechos reservados