Agendador de tarefas em Node.js: node-schedule e node-cron
No desenvolvimento web moderno, surge frequentemente a necessidade de executar determinadas ações em um horário específico ou em intervalos regulares. Por exemplo, envio de relatórios por email, limpeza de banco de dados, raspagem de recursos externos ou atualização de cache. No ambiente Node.js, agendadores de tarefas são usados para esses fins. Duas das ferramentas mais populares são node-schedule e node-cron. Neste artigo, analisaremos ambas em detalhes, forneceremos exemplos de código e ajudaremos você a escolher a mais adequada para o seu projeto.
Por que preciso de um agendador de tarefas em Node.js?
Node.js é um ambiente single-thread com arquitetura orientada a eventos. As funções embutidas setTimeout e setInterval permitem executar código com atraso ou periodicamente, mas não são adequadas para cenários complexos:
- Não há flexibilidade na configuração (por exemplo, "toda segunda segunda-feira do mês às 10:30").
- Não mantêm o estado após a reinicialização da aplicação.
- Dificuldade de gerenciamento (cancelamento, alteração de agendamento).
Os agendadores resolvem esses problemas, fornecendo uma API simples para criar, iniciar e cancelar tarefas agendadas.
Biblioteca node-schedule
node-schedule é um agendador flexível, baseado em uma sintaxe semelhante ao cron, mas com recursos avançados. Ele permite definir tarefas recorrentes com precisão de minuto, bem como tarefas únicas para uma data específica.
Instalação
npm install node-schedulePrincipais recursos
- Suporte a expressões cron (6 campos: segundos, minutos, horas, dia do mês, mês, dia da semana).
- Possibilidade de definir execução única usando um objeto Date.
- Regras recorrentes usando o objeto
RecurrenceRule. - Métodos
cancel()ecancelNext()para gerenciamento de tarefas.
Exemplo 1: Executar tarefa a cada 5 minutos
const schedule = require('node-schedule');
const job = schedule.scheduleJob('*/5 * * * *', function() { console.log('Tarefa executada a cada 5 minutos:', new Date().toLocaleString());});
// Cancelar tarefa após 20 minutossetTimeout(() => { job.cancel(); console.log('Tarefa cancelada');}, 20 * 60 * 1000);Exemplo 2: Tarefa em uma data específica
const schedule = require('node-schedule');
const date = new Date(2025, 5, 15, 10, 30, 0); // 15 de junho de 2025, 10:30:00
const job = schedule.scheduleJob(date, function() { console.log('Tarefa única executada em', new Date().toLocaleString());});
console.log('Tarefa agendada para', date.toLocaleString());Exemplo 3: Regra recorrente complexa
const schedule = require('node-schedule');
const rule = new schedule.RecurrenceRule();rule.dayOfWeek = [1, 3, 5]; // Segunda, quarta, sextarule.hour = 9;rule.minute = 0;
const job = schedule.scheduleJob(rule, function() { console.log('Tarefa executada às 9:00 nos dias úteis (Seg, Qua, Sex)');});Biblioteca node-cron
node-cron é uma alternativa leve, baseada no cron clássico dos sistemas Unix. É mais simples de usar, mas menos flexível que o node-schedule. Suporta 5 campos (minutos, horas, dia do mês, mês, dia da semana).
Instalação
npm install node-cronPrincipais recursos
- Sintaxe cron padrão (5 campos).
- Métodos
start(),stop(),destroy(). - Suporte a fusos horários através da opção
timezone. - Possibilidade de executar a tarefa imediatamente com
now().
Exemplo 1: Executar tarefa todos os dias à meia-noite
const c