Necesito un planificador Nodejs que permita tareas a diferentes intervalos [cerrado]


127

Estoy buscando un horario de trabajo de nodo que me permita programar una serie de tareas a diferentes intervalos. Por ejemplo,

  • llamar a la función A cada 30 segundos
  • llamar a la función B cada 60 segundos
  • llamar a la función C cada 7 días

También quiero poder iniciar y detener el proceso.

Hasta ahora, he mirado:

  • más tarde - la sintaxis me confunde, aparentemente también no puedes programar tareas más allá de un mes

  • agenda - parece la más prometedora, sin embargo, estoy confundido acerca de la funcionalidad de la base de datos

  • plan de tiempo : demasiado simple, no se puede iniciar y detener

La sintaxis de este último me parece confusa.


1
¿Qué tal si usas un setInterval, suena exactamente como lo que buscas?
adeneo

Sí, ¿por qué no usar setInterval?
Yalamber

Sé que bajo el capó algunos de estos usan setInterval, pero estaba buscando algo un poco más alto ... Solía ​​usar el horario ( github.com/dbader/schedule ) en python, y estaba buscando un nodo análogo a eso
usuario379468


Respuestas:


223

Yo recomendaría node-cron. Permite ejecutar tareas utilizando patrones de Cron, por ejemplo

'* * * * * *' - runs every second
'*/5 * * * * *' - runs every 5 seconds
'10,20,30 * * * * *' - run at 10th, 20th and 30th second of every minute
'0 * * * * *' - runs every minute
'0 0 * * * *' - runs every hour (at 0 minutes and 0 seconds)

Pero también horarios más complejos , por ejemplo

'00 30 11 * * 1-5' - Runs every weekday (Monday through Friday) at 11:30:00 AM. It does not run on Saturday or Sunday.

Código de muestra : ejecutar el trabajo cada 10 minutos:

var cron = require('cron');
var cronJob = cron.job("0 */10 * * * *", function(){
    // perform operation e.g. GET request http.get() etc.
    console.info('cron job completed');
}); 
cronJob.start();

Puedes encontrar más ejemplos en el wiki de node-cron

Puede encontrar más información sobre la configuración de cron en cron wiki

He estado usando esa biblioteca en muchos proyectos y hace el trabajo. Espero que le ayudará.


ok, me sentí intimidado por la sintaxis de cron, pero este parece ser el mejor enfoque
user379468

1
espera, hablé pronto, ¿cómo escribiría un cron que se ejecuta cada 5 segundos o cada 30 segundos?
user379468

3
La sintaxis de cron puede parecer aterradora . Por otro lado, existe desde hace mucho tiempo y es ampliamente conocido, por lo que obtendrá mucho apoyo en SO
Tom

1
Acabo de actualizar mi respuesta para que sea - '* / 5 * * * * *' - cada 5 segundos o '* / 30 * * * * *' segundos
Tom

1
A partir del año 2020, y según la página npm oficial de node-cron , el uso de este paquete ha disminuido. Este paquete se publicó por última vez en npm hace 2 años, por lo tanto, no se actualiza regularmente. Ahora, debería preferirse otro paquete node-cron que aparentemente tenga el mismo nombre pero que tenga una URL diferente.
n0noob

36

He usado node-cron y agenda .

node-cron es una biblioteca muy simple, que proporciona una API muy básica y fácil de entender como crontab. No necesita ninguna configuración y simplemente funciona.

var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function(){...});
myJob.start();

La agenda es muy poderosa y adecuada para servicios mucho más complejos. Piensa en ifttt , tienes que ejecutar millones de tareas. La agenda sería la mejor opción.

Nota: Necesita Mongodb para usar Agenda

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();

1
por alguna razón, cuando trato de usar Agenda, aparece un error ReferenceError: Agenda no está definida. Instalé el paquete con NPM, ¿tengo que hacer algo antes de crear una agenda?
user379468

2
Creo que debe solicitarlo a su variable local. Agenda var = require ("Agenda");
Ryan Wu

1
Recientemente escribí un comentario en el blog sobre la agenda, la configuración del proyecto y la estructura del proyecto goo.gl/5sCNBM
Robin Wieruch

1
Tenga en cuenta que necesita que Mongodb se ejecute para usar Agenda
Mark Robson

1
¿El nodo-cron o la agenda generan un proceso de sistema de nodo separado? ¿Puedes usarlos en una configuración de proceso de múltiples nodos?
Prasad Silva

14

Creo que el mejor ranking es

1.nodo-horario

2. más tarde

3.crontab

y la muestra de nodo-horario está abajo:

var schedule = require("node-schedule");
var rule = new schedule.RecurrenceRule();
//rule.minute = 40;
rule.second = 10;
var jj = schedule.scheduleJob(rule, function(){
    console.log("execute jj");
});

Tal vez pueda encontrar la respuesta de los módulos de nodo .


1
Me encanta la sintaxis, gracias por compartir
Overdrivr

10

He escrito un módulo de nodo que proporciona un contenedor alrededor de setInterval usando duraciones de momento que proporcionan una interfaz declarativa:

npm instalar cada momento

var every = require('every-moment');

var timer = every(5, 'seconds', function() {
    console.log(this.duration);
});

every(2, 'weeks', function() {
    console.log(this.duration);
    timer.stop();
    this.set(1, 'week');
    this.start();
});

https://www.npmjs.com/package/every-moment

https://github.com/raygerrard/every-moment


44
El enlace github está roto (404)
kekko12

Esto es muy legible. He escrito un paquete que utiliza node-croncomo respuesta @Tom. y tiene una buena sintaxis similar a la tuya. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93

@ kekko12 Hay en el NPM: npmjs.com/package/every-moment
Ali Hesari


1

He escrito un pequeño módulo para hacer eso, llamado timexe :

  • Su código simple, pequeño y confiable y no tiene dependencias
  • La resolución es en milisegundos y tiene una alta precisión a lo largo del tiempo.
  • Cron gusta, pero no es compatible (orden inverso y otras mejoras)
  • Yo también trabajo en el navegador

Instalar en pc:

npm install timexe

utilizar:

var timexe = require('timexe');
//Every 30 sec
var res1=timexe(”* * * * * /30”, function() console.log(“Its time again”)});

//Every minute
var res2=timexe(”* * * * *”,function() console.log(“a minute has passed”)});

//Every 7 days
var res3=timexe(”* y/7”,function() console.log(“its the 7th day”)});

//Every Wednesdays 
var res3=timexe(”* * w3”,function() console.log(“its Wednesdays”)});

// Stop "every 30 sec. timer"
timexe.remove(res1.id);

puede lograr la funcionalidad de inicio / detención al eliminar / volver a agregar la entrada directamente en la matriz de trabajos timexe. Pero no es una función expresa.


44
Deberías mencionar que eres el autor.
a20

13
@ a20 "ha escrito un pequeño módulo para hacer precisamente eso" significa que él es el autor en caso de que se salte mientras leía
PirateApp
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.