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.