Ho bisogno di un programmatore Nodejs che consenta attività a diversi intervalli [chiuso]


127

Sto cercando un programma di lavoro nodo che mi permetterà di pianificare una serie di attività a diversi intervalli. Per esempio,

  • chiama la funzione A ogni 30 secondi
  • chiama la funzione B ogni 60 secondi
  • chiama la funzione C ogni 7 giorni

Voglio anche essere in grado di avviare e interrompere il processo.

Finora ho visto:

  • più tardi - la sintassi mi confonde, anche a quanto pare non puoi pianificare le attività oltre un mese

  • agenda - sembra la più promettente, tuttavia sono confuso sulla funzionalità del database

  • timeplan : troppo semplice, impossibile avviare e arrestare

Trovo confusa la sintassi di quest'ultimo.


1
Che ne dici di usare solo un setInterval, sembra esattamente quello che stai cercando?
adeneo,

Sì, perché non usare setInterval?
Yalamber,

So che alcuni di questi usano setInterval, ma stavo cercando qualcosa di un livello leggermente più alto ... Ero abituato a usare schedule ( github.com/dbader/schedule ) in Python, e stavo cercando un nodo analogo a quello
user379468


Ho usato l'agenda, non male
Aleksandr Golovatyi

Risposte:


223

Lo consiglierei node-cron. Permette di eseguire attività usando modelli Cron ad es

'* * * * * *' - 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)

Ma anche programmi più complessi, ad es

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

Codice di esempio : esecuzione del processo ogni 10 minuti:

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();

Puoi trovare altri esempi nella wiki di node-cron

Ulteriori informazioni sulla configurazione cron sono disponibili sul cron wiki

Ho usato quella biblioteca in molti progetti e fa il lavoro. Spero che possa essere d'aiuto.


ok, sono stato intimidito dalla sintassi cron, ma questo sembra l'approccio migliore
user379468

1
aspetta ho parlato presto, come scriverei un cron che viene eseguito ogni 5 secondi o ogni 30 secondi?
user379468

3
la sintassi cron potrebbe sembrare spaventosa . D'altra parte esiste da molto tempo ed è ampiamente noto, quindi otterrà molto supporto su SO
Tom

1
Ho appena aggiornato la mia risposta in modo che sia - '* / 5 * * * * *' - ogni 5 secondi o '* / 30 * * * * *' secondi
Tom

1
A partire dall'anno 2020, e secondo la pagina npm ufficiale di node-cron , l'uso di questo pacchetto è diminuito. Questo pacchetto è stato pubblicato l'ultima volta in npm 2 anni fa, quindi non viene aggiornato regolarmente. Ora, dovrebbe essere preferito piuttosto un altro pacchetto node-cron che apparentemente ha lo stesso nome ma che ha un URL diverso.
n0noob,

36

Ho usato node-cron e agenda .

node-cron è una libreria molto semplice, che fornisce API molto semplici e di facile comprensione come crontab. Non ha bisogno di alcuna configurazione e funziona.

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

l'agenda è molto potente e adatta a servizi molto più complessi. Pensa a ifttt , devi eseguire milioni di attività. l'agenda sarebbe la scelta migliore.

Nota: è necessario Mongodb per utilizzare Agenda

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

1
per qualche motivo, quando provo ad usare Agenda ricevo un errore ReferenceError: Agenda non è definito. Ho installato il pacchetto con NPM, devo fare qualcosa prima di creare un'agenda?
user379468

2
penso che devi richiederlo alla tua variabile locale. var Agenda = richiedono ("Agenda");
Ryan Wu,

1
Di recente ho scritto un commento sul blog sull'agenda, sulla configurazione del progetto e sulla struttura del progetto goo.gl/5sCNBM
Robin Wieruch,

1
Nota che hai bisogno di Mongodb in esecuzione per usare Agenda
Mark Robson

1
Node-cron o agenda generano un processo di sistema di nodo separato? Puoi usarli in una configurazione di processo multi-nodo?
Prasad Silva,

14

Penso che la migliore classifica sia

1.node-schedule

2.later

3.crontab

e l'esempio della pianificazione dei nodi è di seguito:

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");
});

Forse puoi trovare la risposta dai moduli del nodo .


1
Adoro la sintassi, grazie per la condivisione
Overdrivr

10

Ho scritto un modulo nodo che fornisce un wrapper attorno a setInterval usando le durate dei momenti che forniscono un'interfaccia dichiarativa:

npm installa ogni 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


4
Il link github è interrotto (404)
kekko12

questo è molto leggibile. ho scritto un pacchetto che usa node-croncome risposta @ Tom. e ha una bella sintassi simile alla tua. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93

@ kekko12 C'è su NPM: npmjs.com/package/every-moment
Ali Hesari


1

Ho scritto un piccolo modulo per fare proprio questo, chiamato timexe :

  • È un codice semplice, piccolo e affidabile e non ha dipendenze
  • La risoluzione è in millisecondi e ha un'alta precisione nel tempo
  • Cron like, ma non compatibile (ordine invertito e altri miglioramenti)
  • Lavoro anche nel browser

Installare:

npm install timexe

uso:

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);

è possibile ottenere la funzionalità di avvio / arresto rimuovendo / aggiungendo nuovamente la voce direttamente nella matrice dei lavori timexe. Ma non è una funzione espressa.


4
Dovresti dire che sei l'autore.
a20,

13
@ a20 "hanno scritto un piccolo modulo per fare proprio questo." significa che è l'autore nel caso in cui tu abbia saltato durante la lettura
PirateApp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.