Planificador de tareas en Node.js: node-schedule y node-cron
En el desarrollo web moderno, a menudo surge la necesidad de realizar ciertas acciones en un momento determinado o a intervalos regulares. Por ejemplo, enviar informes por correo electrónico, limpiar la base de datos, analizar recursos externos o actualizar la caché. En el entorno Node.js, se utilizan planificadores de tareas para estos fines. Las dos herramientas más populares son node-schedule y node-cron. En este artículo, analizaremos ambas en detalle, proporcionaremos ejemplos de código y le ayudaremos a elegir la adecuada para su proyecto.
¿Por qué necesito un planificador de tareas en Node.js?
Node.js es un entorno de un solo subproceso con una arquitectura basada en eventos. Las funciones integradas setTimeout y setInterval permiten ejecutar código con un retraso o periódicamente, pero no son adecuadas para escenarios complejos:
- No hay flexibilidad en la configuración (por ejemplo, "cada segundo lunes del mes a las 10:30").
- No conservan el estado después de reiniciar la aplicación.
- Dificultades con la gestión (cancelación, cambio de horario).
Los planificadores resuelven estos problemas proporcionando una API simple para crear, iniciar y cancelar tareas programadas.
Biblioteca node-schedule
node-schedule es un planificador flexible basado en una sintaxis similar a cron, pero con capacidades mejoradas. Permite establecer tareas recurrentes con precisión de minutos, así como tareas únicas para una fecha específica.
Instalación
npm install node-scheduleCaracterísticas principales
- Soporte para expresiones cron (6 campos: segundos, minutos, horas, día del mes, mes, día de la semana).
- Posibilidad de establecer una ejecución única utilizando un objeto Date.
- Reglas recurrentes utilizando el objeto
RecurrenceRule. - Métodos
cancel()ycancelNext()para gestionar tareas.
Ejemplo 1: Ejecutar una tarea cada 5 minutos
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', function() { console.log('Tarea ejecutándose cada 5 minutos:', new Date().toLocaleString());});
// Cancelar la tarea después de 20 minutossetTimeout(() => { job.cancel(); console.log('Tarea cancelada');}, 20 * 60 * 1000);Ejemplo 2: Tarea para una fecha específica
const schedule = require('node-schedule');
const date = new Date(2025, 5, 15, 10, 30, 0); // 15 de junio de 2025, 10:30:00
const job = schedule.scheduleJob(date, function() { console.log('Tarea única ejecutada a las', new Date().toLocaleString());});
console.log('Tarea programada para el', date.toLocaleString());Ejemplo 3: Regla recurrente compleja
const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();rule.dayOfWeek = [1, 3, 5]; // Lunes, miércoles, viernesrule.hour = 9;rule.minute = 0;
const job = schedule.scheduleJob(rule, function() { console.log('Tarea ejecutándose a las 9:00 los días laborables (Lun, Mié, Vie)');});Biblioteca node-cron
node-cron es una alternativa ligera basada en el cron clásico de los sistemas Unix. Es más simple de usar, pero menos flexible que node-schedule. Soporta 5 campos (minutos, horas, día del mes, mes, día de la semana).
Instalación
npm install node-cronCaracterísticas principales
- Sintaxis cron estándar (5 campos).
- Métodos
start(),stop(),destroy(). - Soporte de zonas horarias a través de la opción
timezone. - Posibilidad de ejecutar una tarea inmediatamente con
now().
Ejemplo 1: Ejecutar una tarea todos los días a medianoche
const c También en la biblioteca
Caching en TypeScript: Redis, node-cache y otras herramientas
openapi-typescript para TypeScript: guía completa con ejemplos
ORM para Rust: comparativa de Diesel, SeaORM, SQLx y ejemplos de código
Registro para Swift (iOS/macOS): mejores bibliotecas y soluciones
Generación de informes PDF en Rust: biblioteca printpdf