NEWS
AXIOS Fehler auf Produktionssystem, dev-server geht
-
Hallo,
ich arbeite seit einigen Tagen an einem Adapter für die Ansteuerung der SMA Wallbox (SMA EV Charger 7.4 / 22) über das Web-Interface der Box. Dazu verwende ich mit AXIOS POST, GET und PUT Anfragen. In meiner Entwicklungsumgebung (dev-server) funktioniert die Abfrage eines Authorization Tokens (über POST) ohne Probleme. Auf dem Produktivsystem (gleiches Netzwerk, Ubuntu, meine "echte" ioBroker Installation) bekomme ich mit dem gleichen Adapter einen Status 500 Fehler ("AxiosError: Request failed with status code 500"). Wenn ich den dev-server auf dem gleichen System wie dem Produktivsystem teste, dann funktioniert es auch. Leider gibt es bis auf die Fehlermeldung AxiosError (siehe oben) keine weiteren Informationen. Hat jemand eine Idee, warum es auf dem dev-server funktioniert, auf der "echten" ioBroker Installation dann aber nicht?
Repository:
https://github.com/drb-germany/ioBroker.smaevchargerAn das Moderatorenteam: Post bitte in Entwicklung verschieben, dort konnte ich keinen Beitrag erstellen (keine Rechte?).
Danke.
-
du könntest versuchen mit curl auf der shell den request mal nachzustellen.
bei curl kann man eine detaillierten debug ausgabe einstellen (option --verbose, vgl auch https://curl.se/docs/manpage.html).
bei einem 500er Fehler ist aber eher die Wallbox der Verursacher. Irgendwas schmeckt dem dann noch nicht, auch wenn es auf einem anderen weg geht (kann mir adhoc da zwar auch nix vorstellen, aber deswegen der weg mit curl)
kannst du in der wallbox in ein log schauen? da müsste etwas genaueres drin stehen. aber verstehe auch, das das bei geschlossenen anwendungen manchmal schwierig ist.du sendest die request aus einem adapter heraus und nicht vom browser aus? dann scheidet cors auch aus.
hast du schon mal in error.response.data geschaut?
evtl steht da was detaillierteres drin wie in error
https://axios-http.com/docs/handling_errorsich hab mal in den code geschaut, verursacht zwar kein Problem aber
headers: { accept: 'application/json, text/plain, */*', },
da reicht nur application/json, da dein Programm ja sonst kein anderes Format erwartet oder verarbeiten kann. eigentlich kannst accept auch weglassen. idealerweise sollte der content-type ausreichen
-
Danke für die schnelle Antwort, @oliverio.
Mit curl funktioniert der Request, es geht ja auch mit dem dev-server auf dem Ubuntu Server wo es unter der finalen ioBroker Instanz nicht funktioniert. Ich kann mir das eigentlich nur mit unterschiedlichen Versionen von AXIOS erklären, weil sonst ist ja alles gleich ist.
Der Request geht vom Adapter aus raus. Error.response.data habe ich probiert, das gibt eine Exception, da es das Objekt nicht gibt.
Ich werde versuchen/prüfen ob die Versionen gleich sind und ggf. mal ein anderes Paket nutzen. Die Installation über den GitHub-Link ist aber der richtige Weg das im Produktivsystem zu testen, oder? Das macht es halt immer etwas aufwändig, da man einen recht langen Weg hat...
-
Habe es jetzt hinbekommen, indem ich für den Token-Post von AXIOS auf node-fetch gewechselt habe.
Werde das jetzt noch etwas testen und dann einheitlich machen. Ist mir trotzdem ein Rätsel, warum AXIOS hier nicht funktioniert hat.
-
@drb-germany sagte in AXIOS Fehler auf Produktionssystem, dev-server geht:
Error.response.data
es wäre ein kleines error.respone.data und nicht Error.reponse.data gewesen.
Gemäß doku muss es das geben.
Schaust du da mit einem debugger rein?@drb-germany sagte in AXIOS Fehler auf Produktionssystem, dev-server geht:
Die Installation über den GitHub-Link ist aber der richtige Weg das im Produktivsystem zu testen, oder?
im Produktiv system ja.
-
@oliverio: Ja, im Code habe ich es richtig drin, das error.response.data Objekt ist dann auf dem Produktivsystem tatsächlich einfach nur leer.
.catch((error) => { this.setState('info.connection', false, true); if (error.response) { // The request was made and the server responded with a status code // that falls out of the range of 2xx this.log.error(`Response: ${JSON.stringify(error.response.data)}`); this.log.error(`Status: ${JSON.stringify(error.response.status)}`); this.log.error(`Headers: ${JSON.stringify(error.response.headers)}`); } else if (error.request) { // The request was made but no response was received // `error.request` is an instance of XMLHttpRequest in the browser and an instance of // http.ClientRequest in node.js this.log.error(`Request: ${error.request}`); } else { // Something happened in setting up the request that triggered an Error this.log.error(`Error: ${error.message}`); } this.log.error(`Config: ${JSON.stringify(error.config)}`); });
Logs:
Mit node-fetch läuft es aber jetzt zumindest.
-
@drb-germany
Keine Ahnung ob das was mit deinem Problem zu tun hat. Aber wir hatten im Telegram Developer Channel erst gestern die Diskussion zu await / async /.then. An sich ist die Kombination async und .then von der Sprache her zulässig. ABER die Meinung war weitestgehenst dies nicht zu machen.Also ENTWEDER asynchron mit await zu arbeiten ODER mit Verkettung über .then ...
Falls du noch Probleme hast, schau mal im Developer Channel rein und frag dort nochmal.
https://t.me/+gsX-e8k4mLtmZjZk
https://t.me/ioBroker_development -
@drb-germany
Außerdem scheinst du axios NICHT als dependency eingetragen zu haben (package.json)Check das mal. Ev. hats du schlicht und einfach unterschiedliche Axios Versionen am dev.sever und in prod.