[Diese Frage ist ziemlich vage, ich entschuldige mich dafür. Ich versuche, meine verschiedenen Probleme zu adressieren, indem ich die Frage selbst beantworte]Eine Node.js-App ordnungsgemäß ohne Expressgerüst aufbauen (die App erhält keine Anfragen)
Ich baue eine Node.js App, die verschiedene Aufgaben in bestimmten Intervallen ausführen muss. Hier wird die globale Gerüst (betrifft die drossel Versprechungen und Mungo für DB-Wechselwirkungen):
var Promise = require("bluebird");
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
// Personal modules
var bootApp = require(...);
var doStuffA = require(...);
var doStuffB = require(...);
var doStuffC = require(...);
// running locally, but meant to be deployed at some point
mongoose.connect('mongodb://localhost:27017/myDatabase');
var db = mongoose.connection;
db.on('error',() => {
console.log("Error : lost connection !"));
process.exit(1);
});
db.once('open',() => {
\t
bootApp() // always start by booting
.then(() => { // then start the infinite loop of events
setInterval(doStuffA, 1000*60*60); // 1x/1h
setInterval(doStuffB, 1000*60*10); // 1x/10min
setInterval(doStuffC, 1000*60*3); // 1x/3min
}).catch((e) => { // errors are handled by doStuffX(), so we should never catch anything here
console.log(e.message);
process.exit(1);
});
});
Jedes Modul doStuffX
ist eine Funktion, ein Versprechen der Rückkehr, seine eigene Fehlerbehandlung und sollte irgendwann beenden .
erwartetes Verhalten für die gesamte App:
- Die App sollte immer laufen können
- Die App
doStuffX()
bei dem gegebenen Intervall versuchen sollte, unabhängig davon, ob es erfolgreich war oder zuletzt gescheitert. - [Optional:] Die App sollte reibungslos schließen, ohne eine
doStuff
bei Empfang eines "Herunterfahren" -Signals erneut zu versuchen.
Meine Frage: Wie baue ich ein sauberes Gerüst für eine solche App? Kann ich setInterval
loswerden und stattdessen Versprechen verwenden? Eines meiner Hauptanliegen ist es, sicherzustellen, dass die vorherige Instanz von doStuffX()
fertig ist, bevor die nächste gestartet wird, auch wenn es dazu führt, dass sie irgendwie "zerstört" wird.
Ich bin offen für jeden Link über Scaffolding-Apps, aber bitte geben Sie mir keine Antwort/LINK INVOLVING EXPRESS: Ich brauche nicht Express, da meine App keine Anfrage erhält. (Alles, was ich bisher gefunden beginnt mit Express: /)
Warum würden Sie 'setInterval()' loswerden? Sie benötigen einen Timer, um wiederkehrende Funktionsaufrufe auszuführen. Es gibt keinen Ersatz für 'setInterval()' mit Versprechungen, da die beiden ziemlich unterschiedliche Tiere sind, so dass die ganze Anfrage nur fehlgeleitet klingt. – jfriend00
Was ist los mit dem Gerüst, das Sie haben? Es sieht so aus, als würde es gut funktionieren. – jfriend00
Sind Sie sicher, dass Sie den Prozess bei einem Datenbankfehler beenden möchten, wenn Sie erwarten, dass dies für immer ausgeführt wird? Sollten Sie nicht die Fehler protokollieren und sich vielleicht die Art der Fehler ansehen, um zu entscheiden, welche Maßnahme angemessen ist? – jfriend00