Je suis nouveau sur node.js. J'ai besoin de node.js pour interroger un mongodb toutes les cinq minutes, obtenir des données spécifiques, puis en utilisant socket.io, permettre aux clients Web abonnés d'accéder à ces données. J'ai déjà la partie socket.io configurée et bien sûr mongo, j'ai juste besoin de savoir comment faire tourner node.js toutes les cinq minutes puis poster sur socket.io.
Quelle est la meilleure solution pour cela?
Merci
var minutes = 5, the_interval = minutes * 60 * 1000;
setInterval(function() {
console.log("I am doing my 5 minutes check");
// do your stuff here
}, the_interval);
Enregistrez ce code sous node_regular_job.js et exécutez-le :)
Voici comment procéder si vous aviez des tâches asynchrones à gérer:
(function schedule() {
background.asyncStuff().then(function() {
console.log('Process finished, waiting 5 minutes');
setTimeout(function() {
console.log('Going to restart');
schedule();
}, 1000 * 60 * 5);
}).catch(err => console.error('error in scheduler', err));
})();
Vous ne pouvez cependant pas garantir quand il commencera, mais au moins vous n'exécuterez pas plusieurs fois le travail en même temps, si votre travail prend plus de 5 minutes pour s'exécuter.
Vous pouvez toujours utiliser setInterval
pour planifier un travail asynchrone, mais si vous le faites, vous devez au moins marquer les tâches traitées comme "en cours de traitement", de sorte que si le travail doit être planifié une deuxième fois avant les finitions précédentes, votre logique peut décider de ne pas traiter les tâches qui sont encore en cours de traitement.
@ alessioalex a la bonne réponse lors du contrôle d'un travail à partir du code, mais d'autres pourraient trébucher ici à la recherche d'une solution CLI. Vous ne pouvez pas battre sloth-cli
.
Exécutez simplement, par exemple, sloth 5 "npm start"
courir npm start
toutes les 5 minutes.
Ce projet a un exemple package.json
utilisation.
Vous pouvez utiliser ce package
var cron = require('node-cron');
cron.schedule('*/5 * * * *', () => {
console.log('running a task 5 minutes');
});