Se tem uma coisa pela qual eu sou apaixonado por tecnologia é automação. Pra mim, a tecnologia é justamente um instrumento para tornar a nossa vida melhor e automatizar coisas que não queremos ou não podemos fazer é uma das melhores coisas que um programador pode aprender pois isso dá muito retorno. Entenda retorno como quiser: tempo, dinheiro, oportunidades, etc.
No tutorial de hoje eu vou lhe ensinar como executar tarefas agendadas em Node.js, ou seja, em uma data futura ou a cada x intervalo de tempo, disparar um código seu em Node.js, que pode ser fazer uma consulta no banco, uma chamada de API, escrever em um arquivo ou o que quer que você precise fazer.
Você pode acompanhar o conteúdo desta lição no vídeo abaixo, caso prefira assistir ao invés de ler.
#1 – Setup do Projeto
Primeiro vamos precisar ter um projeto Node.js criado e espero que você já tenha instalado o Node na sua máquina. Crie uma pasta para o projeto e dentro dela rode o comando a seguir no terminal.
1 2 3 |
npm init -y |
Agora, vamos instalar as dependências que vamos precisar neste projeto.
1 2 3 |
npm i node-schedule |
Para o agendamento em si vou usar Node Schedule, uma biblioteca que já uso em outro projeto semelhante e que é muito bacana e simples, permitindo não apenas o agendamento da execução de um script como a execução em intervalos.
Mas Luiz, não é só fazer um setTimeout ou um setInterval? Pra que um pacote pra isso?
Tudo que vou mostrar dá pra fazer com setTimeout e.ou com setInterval, mas Node Schedule é muito mais poderoso que isso e muito mais fácil de gerenciar múltiplos agendamentos. Ele resolve problemas como:
- e se eu quiser que um script execute às 20h45m03s do dia 10/10/21?
- e se eu quiser que um script execute todas as segundas-feiras a cada 5 minutos?
- e se eu quiser cancelar o agendamento de um dos scripts acima?
- e se eu quiser ver quando que será a próxima execução do script?
Entre outras. Aliás, esta biblioteca é a minha favorita para este tipo de atividade pois ela funciona tanto com datas quanto com expressões CRON.
Apenas o que ele não faz é persistência, ou seja, tudo acontece in memory e se você derrubar sua aplicação, todos seus agendamentos caem por terra junto. Mas isso você pode resolver juntando os conhecimentos deste tutorial com algum dos vários bancos de dados que ensino a usar aqui no blog, como MySQL, PostgreSQL, MS SQL Server, SQLite e MongoDB.
Mas voltando ao assunto central, agora que você tem as dependências instaladas, crie um arquivo index.js com um console log só pra dizer que funcionou e modifique seu package.json para que esse seja o ponto central de execução da aplicação.
1 2 3 |
"start": "npx nodemon index.js" |
Repare como nesta instrução eu baixo e executo o Nodemon, outro pacote muito popular e que vai ajudar a garantir que nossa aplicação fique sempre executando e que a cada alteração que a gente fizer no código, ele vai recarregar tudo automaticamente. Repare que esta não é uma solução profissional para deploy (onde sugiro PM2), é apenas para ficar rodando localmente mesmo.
Agora que nosso projeto está configurado, vamos iniciar o desenvolvimento dele.
#2 – Implementando a execução agendada
Vamos dizer que, por exemplo, eu queira que às 09h do dia 21/10/2021 eu quero que execute um script Node.js específico, como usar a Node Schedule para agendar uma execução na data e hora determinadas na minha estratégia? O código abaixo te mostra.
1 2 3 4 5 6 7 8 9 10 11 |
const nodeSchedule = require('node-schedule'); const dt = new Date(2021,9,21,9); const job = nodeSchedule.scheduleJob(dt, () => { console.log("olá mundo"); }); console.log(job.nextInvocation()); |
Repare como logo após o carregamento comum do pacote eu monto um objeto de data no JavaScript (atenção ao campo do mês que começa em zero), que depois será passado como primeiro argumento da função scheduleJob, enquanto que o segundo é uma função de callback que será disparada exatamente na data especificada.
O retorno desta função é um objeto Job, que você pode usar para cancelar seu agendamento ou pegar informações, como fiz no exemplo, para saber para quando ele agendou a execução.
Se você executar agora esta aplicação nada demais vai acontecer e terá de esperar o instante do agendamento chegar para que a mensagem seja impressa. Assim, recomendo que coloque uma data que esteja próxima de acontecer, a fim de ver o teste funcionando.
#3 – Implementando a execução recorrente
Agora, imagine que você queira que determinado script aconteça várias vezes, seja recorrente. Ao invés de criar um laço no código anterior pra ficar multiplicando seus efeitos, podemos usar a Node Schedule passando uma expressão CRON pra ela.
Expressões CRON são recursos muito populares no Linux para agendamento e recorrência de execução de scripts. Usando uma sintaxe própria (que você pode montar em sites como CRON Maker), você define facilmente de quanto em quanto deseja que o job seja disparado.
Sendo assim, vamos escrever outro código, agora passando uma expressão CRON para dizer ao Node Schedule que ele deve executar o script a cada 1 minuto, eternamente.
1 2 3 4 5 |
const job = nodeSchedule.scheduleJob('*/1 * * * *', () => { console.log(new Date()); }); |
Neste exemplo, a cada 1 minuto nossa aplicação vai imprimir a hora atual do sistema, comprovando a sua execução.
Claro que estes dois exemplos foram bem simples, com foco na didática, e imagine que a função de callback poderia fazer qualquer coisa que você saiba programar em Node.js.
Espero ter ajudado com estes breves exemplos e qualquer dúvida que tiver, pode colocar aí nos comentários.
Quer ver uma aplicação prática deste pacote? Confere o vídeo abaixo onde mostro como usar ele para agendar compra e venda de criptomoedas.
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.