NEWS
[gelöst] Socket Problem - uncaught exception bei connect
-
Hallo zusammen,
ich möchte in einem Event getriggerten JavaScript einen String an einen Server schicken. Das funktioniert auch, solange der Server, an den der String geschickt wird, verfügbar ist. Ist er nicht verfügbar, kommt es nach kurzer Zeit zu einer Excetion und der komplette Scripting Adapter startet neu. Kann mir jemand helfen, wie ich diese Exception fangen bzw. vermeiden kann? Schonmal vielen Dank!
Gruß
AlexiHier das Script:
var net = require('net'); on({ id: /^sonoff.0.*.POWER|^sonoff.0.*.ENERGY_Power/, change: 'ne' }, function (obj) { var client = new net.Socket(); log(obj.id + ": " + obj.state.val); client.connect(47222, '192.168.5.66', function() { log('Connected'); client.write(obj.id + ": " + obj.state.val+"#"); log('Written'); }); client.on('data', function(data) { log('Received: ' + data); client.destroy(); // kill client after server's response }); client.on('close', function() { log('Connection closed'); }); client.on('timeout', function() { log('Connection timeout'); client.destroy(); // kill client after timeout }); });
und hier der Log:
host.my_host 2020-04-19 09:52:59.250 info Restart adapter system.adapter.javascript.0 because enabled host.my_host 2020-04-19 09:52:59.250 info instance system.adapter.javascript.0 terminated with code 0 (NO_ERROR) host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: port: 47222 } host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: address: '192.168.5.66', host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: syscall: 'connect', host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: code: 'ETIMEDOUT', host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: errno: 'ETIMEDOUT', host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14) host.my_host 2020-04-19 09:52:59.249 error Caught by controller[0]: { Error: connect ETIMEDOUT 192.168.5.66:47222 javascript.0 2020-04-19 09:52:58.681 info (1080) Terminated (NO_ERROR): Without reason javascript.0 2020-04-19 09:52:58.681 info (1080) terminating javascript.0 2020-04-19 09:52:58.666 info (1080) script.js.Test.Test: Connection closed javascript.0 2020-04-19 09:52:58.661 info (1080) Stop script script.js.common.Script_n [...] javascript.0 2020-04-19 09:52:58.653 info (1080) Stop script script.js.common.Script_2 javascript.0 2020-04-19 09:52:58.653 info (1080) Stop script script.js.common.Script_1 javascript.0 2020-04-19 09:52:58.653 error (1080) Error: connect ETIMEDOUT 192.168.5.66:47222 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14) javascript.0 2020-04-19 09:52:58.653 error (1080) uncaught exception: connect ETIMEDOUT 192.168.5.66:47222 javascript.0 2020-04-19 09:56:46.377 info (6952) script.js.Test.Test: sonoff.0.Steckdose1.ENERGY_Power: 0 javascript.0 2020-04-19 09:56:36.393 info (6952) script.js.Test.Test: sonoff.0.Steckdose1.ENERGY_Power: 1
-
Ich antworte mir mal selbst.
Nachdem ich gestern schon eine Weile nach einer Lösung gesucht hatte, ist mir jetzt klar geworden, was man tun muss.
Nach dem Erstellen des Sockets muss einfach explizit eine Timeout Funktion angegeben werden. Zweckmäßigerweise kann man einfach destroy des Socket selbst angeben, also:var client = new net.Socket(); client.setTimeout(5000, () => client.destroy());