NEWS
[gelöst] net.connect() Fehler lässt Javascript Adapter abstürzen.
-
Hallo,
ich habe ein Script, welches einen lokalen Telnet-Server an Port 3083 abfragt. Funktioniert soweit super.
Nun habe ich jedoch das Problem, dass wenn der Telnet-Server abschmiert, bzw. Port 3083 nicht erreichbar ist, der ganze Javascript Adapter abschmiert und sich neu startet. Im Log findet sich dann folgender Fehlereintrag:````
javascript.0 2017-07-08 12:48:13.979 info starting. Version 3.2.6 in /volume1/@optware/iobroker/node_modules/iobroker.javascript, node: v4.8.0
host.Server 2017-07-08 12:48:11.670 info instance system.adapter.javascript.0 started with pid 30466
host.Server 2017-07-08 12:47:41.652 info Restart adapter system.adapter.javascript.0 because enabled
host.Server 2017-07-08 12:47:41.652 error instance system.adapter.javascript.0 terminated with code 0 (OK)
javascript.0 2017-07-08 12:47:41.617 info terminating
javascript.0 2017-07-08 12:47:41.607 error at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1078:14)
javascript.0 2017-07-08 12:47:41.607 error at exports._exceptionWithHostPort (util.js:930:20)
javascript.0 2017-07-08 12:47:41.607 error at Object.exports._errnoException (util.js:907:11)
javascript.0 2017-07-08 12:47:41.607 error Error: connect ECONNREFUSED 127.0.0.1:3083
javascript.0 2017-07-08 12:47:41.599 error uncaught exception: connect ECONNREFUSED 127.0.0.1:3083Den Aufruf des Telnet-Servers starte ich mit net.connect()```` function readTelnet3083() { var client = net.connect(3083, function () { client.on('data', function(data) { ... ... ... }); client.on('end', function () { console.log('Daten ausgelesen'); }); client.on('error', function(err) { console.log('error:', err.message); }); client.write('command 1\n'); client.write('command 2\n'); client.end(); }); } setInterval(function() { readTelnet3083(); }, 60000);
Wie oder wo kann ich einen Verbindungsfehler abfangen, ohne das der ganze Javascript Adapter abschmiert.
Idealerweise würde ich an der Stelle mittels exec() den Telnet-Server neu starten.
Für Hilfe danke ich im Voraus.
-
Grad unterwegs, daher nur die Richtung: try { connect Befehl} catch (e) { Code für Fehlerfall, logging oder so}
-
So hat es schon mal nicht funktioniert. Der Javascript Adapter schießt sich weiterhin ab. Der Log Eintrag von catch(e) taucht auch nicht auf
setInterval(function() { try { readTelnet3083(); } catch (e) { console.log("Telnet Server nicht erreichbar"); } }, 60000);
-
Bau es mal direkt in deine read Funktion um das net.connect ein
-
Problem gelöst.
Aufrufe von nicht erreichbaren Dienste innerhalb von net.connect() führt zum Absturz des Javascript Adapters. Ich habe es nun etwas umformuliert. Hierbei greift nun auch der Error Handler. Auf diesem Wege habe ich auch direkt einen Timeout-Schutz hinzugefügt. Vielleicht kann es jemand gebrauchen
var net = require('net'); function readTelnet3083() { var client = new net.Socket(); client.setTimeout(1000, function() { client.destroy(); }); client.connect(3083, function() { console.log("Verbunden"); }); client.on('data', function(data) { ... ... Hier wird die Telnet Ausgabe geparsed ... }); client.on('end', function () { console.log('Daten ausgelesen'); }); client.write('command 1\n'); client.write('command 2\n'); client.end(); client.on('error', function(err) { client.destroy(); console.log('Telnet Server nicht erreichbar. Telnet Neustart'); exec('/etc/init.d/telnetservice restart'); }); } setInterval(function() { readTelnet3083(); }, 60000);
Werde noch den Thread-Titel anpassen, da dieser ja nun überhaupt nicht mehr passt