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.