web-dev-qa-db-fra.com

Comment faire fonctionner mon application NodeJS en boucle pour toujours

J'ai écrit une application NodeJS qui appelle une API et publie sur un ordinateur d'extrémité uniquement les jours de la semaine à une heure précise.

Je pourrais configurer un travail cron pour exécuter l'application à l'heure spécifiée, mais je préférerais l'exécuter avec node index.js et le laisser tourner en permanence, ne faisant rien jusqu'à ce que le jour et l'heure soient corrects, puis retournant en "sommeil" jusqu'au jour suivant journée.

Comment puis-je y arriver? J'ai essayé avec une boucle while:

while (true) {
  myApp.run();
}

Évidemment cela ne s'est pas trop bien passé.

Quelle est la bonne façon de le faire? Devrais-je réécrire mes modules pour utiliser des événements, de sorte que j'en émette un quand c'est l'heure et qu'il y a un auditeur qui y réagit?

--edit: Pour être plus précis, j'aimerais qu'il fonctionne de la même manière qu'une application qui contient un serveur Web. Lorsque vous démarrez l'application, celle-ci est en cours d'exécution et attend des connexions. il ne se ferme pas à la fin de la demande et de la connexion, il reste en attente de plus de demandes et de connexions.

--edit 2: La raison pour laquelle je préfère ne pas utiliser de cron est que les jours et l'heure d'exécution sont configurables dans un fichier config.json analysé par l'application. Je préférerais éviter de jouer avec cron et modifier simplement la planification en modifiant le fichier config.json.

--edit 3: J'aimerais coder ceci moi-même et ne pas utiliser de module. Mon cerveau me fait toujours mal lorsque j'essaie d'écrire une application qui tournerait à l'infini et j'aimerais comprendre comment cela se fait plutôt que d'utiliser un module.

--edit 4: Voici ce que j'ai fini par utiliser:

function doStuff() {
  // code to run
};

function run() {
  setInterval(doStuff, 30000);
};

run();
10
springloaded

Voici comment j'ai résolu le problème, comme l'a suggéré @AJS:

function myApp() {
  while (!isItTimeYet) {
    setInterval(myApp, 59000);
  }
}

C'était plus simple que je pensais et j'espère que ça ne perd pas de mémoire.

--edit: Ceci est faux et perd de la mémoire car chaque boucle le rend plus profond. Ceci est le chemin:

function doStuff() {
  // code to run
};

function run() {
  setInterval(doStuff, 30000);
};

run();
0
springloaded

bien, vous pouvez toujours utiliser un simple setInterval :

 function execute(){
   //code to execute

 }


 setInterval(execute,<calculate time interval in milliseconds you want to execute after>);

c'est une manière très simple de le faire. J'espère que cela t'aides.

5
AJS

Vous pouvez utiliser cron module. Et pour le temps et les données que vous pouvez charger à partir de votre fichier de configuration, sans le coder en dur dans le code.

Exemple:

var CronJob = require('cron').CronJob;
var job = new CronJob({
  cronTime: '00 30 11 * * 1-5',
  onTick: function() {
    /*
     * Runs every weekday (Monday through Friday)
     * at 11:30:00 AM. It does not run on Saturday
     * or Sunday.
     */
  },
  start: false,
  timeZone: 'America/Los_Angeles'
});
job.start();
1
Nivesh

Vous pouvez essayer cet outil https://www.npmjs.com/package/forever . C'est assez simple à utiliser:

Il suffit de lancer votre script avec forever start app.js,

0
alunyov

NPM à la rescousse;)

node-schedule

0
Dmitry Matveev