Biblioteca node-schedule: planificador de tareas flexible en TypeScript
En el desarrollo web moderno, a menudo surge la necesidad de ejecutar ciertas acciones en un momento determinado o según un horario. Para el ecosistema Node.js y TypeScript existen varias soluciones, pero node-schedule destaca por su flexibilidad y simplicidad. Esta biblioteca permite crear tanto tareas únicas para una fecha exacta como tareas recurrentes utilizando expresiones cron o intervalos legibles para humanos.
Características principales de node-schedule
- Ejecución en hora exacta – iniciar una tarea en un momento específico (fecha + hora)
- Expresiones cron – sintaxis clásica para tareas periódicas (cada minuto, cada hora, etc.)
- Reglas recurrentes – configuración flexible de repeticiones usando el objeto
RecurrenceRule - Cancelación y pausa – gestión de tareas activas
- Soporte de zonas horarias – trabajo con hora local
Instalación y configuración
Para empezar, instale el paquete a través de npm:
npm install node-schedulenpm install @types/node-schedule --save-devImportación en un archivo TypeScript:
import * as schedule from 'node-schedule';Ejemplo 1: Tarea para una fecha exacta
Creemos una tarea que se ejecutará el 31 de diciembre de 2024 a las 23:59:59:
const date = new Date(2024, 11, 31, 23, 59, 59);
const job = schedule.scheduleJob(date, () => { console.log('🎉 ¡Feliz Año Nuevo 2025!');});
// Cancelar la tarea (si es necesario)// job.cancel();Ejemplo 2: Tarea periódica con expresión cron
Ejecutar una tarea cada 5 minutos:
const job = schedule.scheduleJob('*/5 * * * *', () => { console.log('Ejecutando tarea cada 5 minutos');});Formato de la expresión cron: segundo minuto hora día_del_mes mes día_de_la_semana. En node-schedule se admiten los 6 campos (a diferencia del cron clásico de 5 campos).
Ejemplo 3: Uso de RecurrenceRule
Creemos una tarea que se ejecute cada martes y jueves a las 10:30 a.m.:
const rule = new schedule.RecurrenceRule();rule.dayOfWeek = [2, 4]; // martes y juevesrule.hour = 10;rule.minute = 30;
const job = schedule.scheduleJob(rule, () => { console.log('Enviando informe semanal');});RecurrenceRule admite los siguientes campos:
year– año o array de añosmonth– mes (0-11) o arraydate– día del mes (1-31)dayOfWeek– día de la semana (0-6, donde 0 es domingo)hour– hora (0-23)minute– minuto (0-59)second– segundo (0-59)
Ejemplo 4: Reglas combinadas
Tarea que se ejecuta el último día de cada mes a las 23:59:
const rule = new schedule.RecurrenceRule();rule.month = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; // todos los mesesrule.date = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // últimos días de cada mesrule.hour = 23;rule.minute = 59;rule.second = 59;
const job = schedule.scheduleJob(rule, () => { console.log('Ejecución el último día del mes');});Gestión de tareas
La biblioteca proporciona métodos para el control total de las tareas:
// Crear una tareaconst job = schedule.scheduleJob('*/10 * * * * *', () => { console.log('Cada 10 segundos');});
// Cancelar la tareajob.cancel();
// Verificar si la tarea está activaconsole.log(job.pending()); // true o false
// Cancelar todas las tareasschedule.gracefulShutdow