Heim > Web-Frontend > Front-End-Fragen und Antworten > So beheben Sie das Problem: Der NodeJS-Dienst stürzt immer ab

So beheben Sie das Problem: Der NodeJS-Dienst stürzt immer ab

醉折花枝作酒筹
Freigeben: 2021-04-13 18:44:43
nach vorne
2483 Leute haben es durchsucht

In diesem Artikel erfahren Sie, wie Sie das Problem lösen können, dass der NodeJS-Dienst ständig abstürzt. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

So beheben Sie das Problem: Der NodeJS-Dienst stürzt immer ab

Viele Leute haben ein solches Image. NodeJS ist schneller. Da es jedoch Single-Threaded ist, ist es instabil, etwas unsicher und nicht für die Abwicklung komplexer Geschäfte geeignet Einfaches Geschäftsszenario.

Tatsächlich hat NodeJS eine „fragile“ Seite. Eine „unbehandelte“ Ausnahme, die irgendwo in einem einzelnen Thread generiert wird, führt tatsächlich dazu, dass das gesamte Node.JS abstürzt. Schauen wir uns ein Beispiel an -error.js-Datei:

var http = require('http');

var server = http.createServer(function (req, res) {

  //这里有个错误,params 是 undefined
  var ok = req.params.ok;

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World
');
});

server.listen(8080, '127.0.0.1');

console.log('Server running at http://127.0.0.1:8080/');
Nach dem Login kopieren

Starten Sie den Dienst, testen Sie ihn in der Adressleiste und suchen Sie nach http://127.0.0.1:8080/. Wie erwartet ist der Knoten abgestürzt.

$ node node-error
Server running at http://127.0.0.1:8080/

c:githubscript
ode-error.js:5
  var ok = req.params.ok;
                     ^
TypeError: Cannot read property 'ok' of undefined
    at Server.<anonymous> (c:githubscript
ode-error.js:5:22)
    at Server.EventEmitter.emit (events.js:98:17)
    at HTTPParser.parser.onIncoming (http.js:2108:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
    at Socket.socket.ondata (http.js:1966:22)
    at TCP.onread (net.js:525:27)
Nach dem Login kopieren

Wie kann ich das Problem lösen?

Tatsächlich wird Node.JS mit der heutigen Entwicklung, wenn es dieses Problem nicht einmal lösen kann, wahrscheinlich schon vor langer Zeit niemand mehr verwenden.

Verwenden von uncaughtException

Wir können uncaughtException verwenden, um nicht erfasste Fehler global zu erfassen. Gleichzeitig können Sie auch den Aufrufstapel dieser Funktion ausdrucken. Nach der Erfassung kann dadurch effektiv verhindert werden, dass der Knotenprozess beendet wird.

process.on('uncaughtException', function (err) {
  //打印出错误
  console.log(err);
  //打印出错误的调用栈方便调试
  console.log(err.stack);
});
Nach dem Login kopieren

Dies entspricht Guard innerhalb des Node-Prozesses, aber viele Leute befürworten diese Methode nicht, was bedeutet, dass Sie die Ausnahmen von Node.JS nicht vollständig kontrollieren können.

Verwenden Sie try/catch

Wir können try/catch auch vor dem Rückruf hinzufügen, um auch die Thread-Sicherheit zu gewährleisten.

var http = require('http');

http.createServer(function(req, res) {
  try {
    handler(req, res);
  } catch(e) {
    console.log('
', e, '
', e.stack);
    try {
      res.end(e.stack);
    } catch(e) { }
  }
}).listen(8080, '127.0.0.1');

console.log('Server running at http://127.0.0.1:8080/');

var handler = function (req, res) {
  //Error Popuped
  var name = req.params.name;

  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello ' + name);
};
Nach dem Login kopieren

Der Vorteil dieser Lösung besteht darin, dass der Fehler- und Aufrufstapel direkt auf der Webseite ausgegeben werden kann, auf der er gerade auftritt.

In das Framework integriert

Die Standard-HTTP-Antwortverarbeitung durchläuft eine Reihe von Middleware (HttpModule) und erreicht schließlich den Handler, wie in der folgenden Abbildung dargestellt:




Diese Middleware und dieser Handler verfügen über eine Funktion in NodeJS , Sie sind alle Rückruffunktionen, und die Rückruffunktion ist der einzige Ort, an dem Node zur Laufzeit abstürzt. Gemäß dieser Funktion müssen wir nur einen Try/Catch in das Framework integrieren, um das Ausnahmeproblem relativ perfekt zu lösen, und die Anforderungen anderer Benutzer werden dadurch nicht beeinträchtigt.

Tatsächlich tun dies fast alle aktuellen NodeJS-WEB-Frameworks. Zum Beispiel hat WebSvr, auf dem unser Open-Source-Blog basiert,

einen solchen Ausnahmebehandlungscode:

Line: 207

  try {
    handler(req, res);
  } catch(err) {
    var errorMsg
      = '
'
      + 'Error ' + new Date().toISOString() + ' ' + req.url
      + '
'
      + err.stack || err.message || 'unknow error'
      + '
'
      ;

    console.error(errorMsg);
    Settings.showError
      ? res.end('<pre class="brush:php;toolbar:false">' + errorMsg + '
') : res.end(); }
Nach dem Login kopieren

Was soll ich also tun, wenn dies nicht der Fall ist? in Rückrufen generiert? Keine Sorge, tatsächlich kann ein solches Knotenprogramm überhaupt nicht gestartet werden.

Darüber hinaus weist der eigene Cluster auch eine gewisse Fehlertoleranz auf. Er ist dem Worker von Nginx sehr ähnlich, verbraucht jedoch etwas mehr Ressourcen (Speicher) und ist nicht sehr bequem zu programmieren.

Überwachen Sie den NodeJS-Prozess und zeichnen Sie Fehlerprotokolle auf. Das Problem, dass Node.JS aufgrund von Ausnahmen abstürzt, ist jedoch immer noch zu 100 % zuverlässig try/catch und uncaughtException können nicht abgefangen werden. Beim Ausführen von ourjs traten gelegentlich Ausnahmen beim Lesen von Dateiströmen auf, die von der zugrunde liegenden Ebene ausgelöst wurden. Dies war ein Fehler der zugrunde liegenden libuv.

Angesichts dieser Situation sollten wir der NodeJS-Anwendung einen Daemon-Prozess hinzufügen, damit NodeJS nach einem ungewöhnlichen Absturz sofort wiederbelebt werden kann.

Außerdem sollten diese Ausnahmen im Protokoll aufgezeichnet werden, damit sie nie wieder vorkommen.


Knoten zum Schutz des Knotens verwenden

node-forever bietet eine Schutzfunktion und eine LOG-Protokollierungsfunktion. Es ist sehr einfach zu installieren Dadurch kann der Ressourcenaufwand etwas groß und auch etwas langsam sein. Komplex: OurJS startet das Skript direkt beim Booten, um den Thread-Daemon zu verarbeiten.

Zum Beispiel die in Debian abgelegte ourjs-Startdatei: /etc/init.d/ourjs

Diese Datei ist sehr einfach und enthält nur Startoptionen. Die Kernfunktion des Wächters wird durch eine Endlosschleife implementiert Um zu verhindern, dass zu viele Fehler den Prozess blockieren, starten Sie den Dienst alle 1 Sekunde nach jedem Fehler neu.

[sudo] npm install forever
Nach dem Login kopieren
Die Fehlerprotokollierung ist auch sehr einfach. Sie können die Fehler direkt in der Prozesskonsole in der Datei error.log ausgeben ;> $WEB_DIR/error.log In dieser Zeile steht 2 für Fehler.

Empfohlenes Lernen: Javascript-Video-Tutorial

Das obige ist der detaillierte Inhalt vonSo beheben Sie das Problem: Der NodeJS-Dienst stürzt immer ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage