NEWS
Probleme mit Request Aufruf
-
Hallo zusammen,
nach längerer Zeit habe nehme ich die Weiterentwicklung meine Adapters "Repetierserver2" wieder auf und muss einiges in Ordnung bringen.
Seit dem Update auf js-controller 3.2 läuft mein Adapter nicht mehr - ich habe Probleme mit dem Requestaufruf. ich bin hier jetzt schon seit Tagen dran und komme nicht weiter, daher jetzt ein Hilfeaufruf.Beim Aufruf der folgenden Funktion bricht das Programm immer mit der Fehlermeldung (Log vom Start bis zum Abbruch):
2021-07-02 14:35:19.845 - info: repetierserver.0 (19280) starting. Version 0.0.4 in C:/Program Files/iobroker/Testsystem2/node_modules/iobroker.repetierserver, node: v10.17.0, js-controller: 3.2.16 2021-07-02 14:35:19.867 - info: repetierserver.0 (19280) Repetierserver verbunden 2021-07-02 14:35:19.870 - info: repetierserver.0 (19280) Repetier IP: 192.168.178.40 2021-07-02 14:35:19.874 - info: repetierserver.0 (19280) Repetier ApiKey: d6b9f507-c78d-44e2-bf8b-9ecbfb81f971 2021-07-02 14:35:19.876 - info: repetierserver.0 (19280) Repetier-Port: 3344 2021-07-02 14:35:19.879 - debug: repetierserver.0 (19280) RepetierServer states subscribed 2021-07-02 14:35:29.314 - error: repetierserver.0 (19280) Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 2021-07-02 14:35:29.316 - error: repetierserver.0 (19280) unhandled promise rejection: The id is empty! Please provide a valid id. 2021-07-02 14:35:29.318 - error: repetierserver.0 (19280) Error: The id is empty! Please provide a valid id. at validateId (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.js-controller\lib\adapter.js:496:19) at Template.setObjectNotExists (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.js-controller\lib\adapter.js:3298:17) at SetKanal (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.repetierserver\main.js:1809:14) at PrinterKanaele (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.repetierserver\main.js:1601:5) at Request._callback (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.repetierserver\main.js:610:29) at Request.self.callback (C:\Program Files\iobroker\Testsystem2\node_modules\request\request.js:185:22) at Request.emit (events.js:198:13) at Request.<anonymous> (C:\Program Files\iobroker\Testsystem2\node_modules\request\request.js:1154:10) at Request.emit (events.js:198:13) at IncomingMessage.<anonymous> (C:\Program Files\iobroker\Testsystem2\node_modules\request\request.js:1076:12) 2021-07-02 14:35:29.322 - error: repetierserver.0 (19280) The id is empty! Please provide a valid id. 2021-07-02 14:35:29.324 - error: repetierserver.0 (19280) Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). 2021-07-02 14:35:29.326 - error: repetierserver.0 (19280) unhandled promise rejection: The id is empty! Please provide a valid id. 2021-07-02 14:35:29.327 - error: repetierserver.0 (19280) Error: The id is empty! Please provide a valid id. at validateId (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.js-controller\lib\adapter.js:496:19) at Template.extendObject (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.js-controller\lib\adapter.js:2062:17) at SetKanal (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.repetierserver\main.js:1818:14) at PrinterKanaele (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.repetierserver\main.js:1601:5) at Request._callback (C:\Program Files\iobroker\Testsystem2\node_modules\iobroker.repetierserver\main.js:610:29) at Request.self.callback (C:\Program Files\iobroker\Testsystem2\node_modules\request\request.js:185:22) at Request.emit (events.js:198:13) at Request.<anonymous> (C:\Program Files\iobroker\Testsystem2\node_modules\request\request.js:1154:10) at Request.emit (events.js:198:13) at IncomingMessage.<anonymous> (C:\Program Files\iobroker\Testsystem2\node_modules\request\request.js:1076:12) 2021-07-02 14:35:29.329 - error: repetierserver.0 (19280) The id is empty! Please provide a valid id. 2021-07-02 14:35:29.350 - info: repetierserver.0 (19280) Repetier-Server-Service bereinigt ... 2021-07-02 14:35:29.352 - info: repetierserver.0 (19280) Repetier-Server-Verbindung beendet ... 2021-07-02 14:35:29.353 - info: repetierserver.0 (19280) Repetier-Server-Dienst gestoppt ... 2021-07-02 14:35:29.355 - info: repetierserver.0 (19280) terminating 2021-07-02 14:35:29.356 - warn: repetierserver.0 (19280) Terminated (UNCAUGHT_EXCEPTION): Without reason
Code hierzu:
// neue oder gelöschte Printer function printerUpdate(tadapter, refreshtime){ // Variable für Printeranzahl let fprintercnt = 0; let fprintername = ''; let erl = false; // Abfrage und Auswertung Request( { url: 'http://' + repetierIP + ':' + repetierPort + '/printer/info', json: true }, function(error, response, content){ if (!error && response.statusCode == 200){ //Druckeranzahl fprintercnt = content.printers.length; // Alle Drucker einlesen for (let pp = 0; pp < fprintercnt; pp++) { // Druckername // Array aprinter füllen aprinter[pp] = content.printers[pp].slug; // über alle Printer for (let p = 0; p < fprintercnt; p++) { // Printername fprintername = aprinter[p]; if (fprintername){ // Kanal anlegen/pflegen PrinterKanaele(tadapter, fprintername) //printerdatenpfad = printerpath + 'Printer_' + fprintername; //SetKanal(tadapter, printerdatenpfad, 'Printer ' + fprintername); // hier wurden die weiteren Funktionen entfernt, damit der Code nicht zu lange wird // Druckgeschwindigkeit ändern (10% - 300%) printerdatenpfad = printerpath + 'Printer_' + fprintername + '.Steuern.Werte.Druckgeschwindigkeit'; DatenAusgabe(tadapter, printerdatenpfad, 'state', 'Druckgeschwindigkeit ändern', 'number', true, true, '%', 'value', 100); } } // Message ausgeben PrinterMessage(tadapter, 'Printerupdate durchgeführt'); // Auswertung merken printerauswertung = true; // Durchlauf erledigt erl = true; } } } ); //Funktion erneut nach x Sekunden aufrufen if (erl = false){ clearTimeout(tou1); tou1 = setTimeout(() => { printerUpdate(tadapter, refreshtime); }, refreshtime); } else{ clearTimeout(tou1); } }
Code innerhalb der Funktion wurde gekürzt, damit es nicht noch länger wird!
Kurz zum Ablauf -
- Funktion wird aufgerufen und Request wird ausgeführt (geprüft über Breakpoint in Zeile 5)
- Programm läuft ausserhalb der Funktion weiter
- nach kurzer Zeit springt der Code wieder in die Funktion und führt den Code ab "function(error, responce, content)" (Zeile 16) weiter und führt ihn ordnungsgemäß bis zur geschweiften Klammer (Zeile 74) durch
- jetzt springt er in das Fehlerhandling mit den oben angegeben Fehlerausgaben
Das ich aus einer anderen Programmierwelt komme, tue ich mich schwer, wenn es so tief ins "Eingemachte" geht.
Übrigends: Bei der Internetsuche zu diesem Problem bin ich immer wieder auf die Anmerkung gekommen, dass der Code:
const Request = require('request');
nicht notwendig ist, da 'Request' mittlerweile Bestandteil von Javascript ist - ohne diese Zuweisung funktioniert es bei mir nicht!
Vorab vielen Dank für Eure Unterstützung
Grüße Baumert -
-
Ich habe es schon mit Groß- und Kleinschreibung bei bei request() versucht, spielt bei mir keine Rolle - ich benötige immer
const request = require('request');
Muss ich es anderes aufrufen, wenn es Bestandteil im Javascript-Adapter bei ioBroker ist?
-
@baumert sagte: ich benötige immer
const request = require('request');
Ja natürlich, da Du es in einem eigenen Adapter verwendest.
-
ok, dann ist diese Frage beantwortet - vielen Dank
-
mal kurz eine andere Frage hierzu:
Kann man die Funktion auch "Synchron" aufrufen/ausführen?
Der asynchrone Ablauf liegt mir nicht so, gerade bei debuggen finde ich es schwierig - ich muss hier immer mit definierten Breakpoints arbeiten.
Wahrscheinlich liegt mein Problem auch bei der asynchronen Abarbeitung. -
@baumert nur als Hinweis. Request wird mittlerweile als deprecated im Netz gesehen
axios ist da wohl die.bessere Wahl. Bringt alles mit , auch promised based -
Danke für den Hinweis - schaue ich mir mal an...
-
@gargano
Hallo, super Hinweis mit axios - ich habe eine Funktion jetzt mal von 'request' auf 'axios' umgestellt und dabei gleich mit async und await gearbeitet -> funktioniert einwandfrei.
Hier mal ein Auszug meines neuen Codes:// neue oder gelöschte Printer async function printerUpdate(tadapter, refreshtime){ // Variable für Printeranzahl let fprintercnt = 0; let fprintername = ''; let erl = false; // Abfrage und Auswertung let response = await axios.get('http://' + repetierIP + ':' + repetierPort + '/printer/info'); let content = response.data; if (response.status == 200){ //Druckeranzahl fprintercnt = content.printers.length;
Er ist jetzt noch nicht optimal, aber es funktioniert erst einmal...
Danke und Grüße -
Hallo, ich habe jetzt komplett auf axios und async/await umgestellt - die oben genannten Probleme sind jetzt weg und der Adapter läuft wieder - vielen Dank für Eure Unterstützung.