NEWS
axios - bekomme code-Änderung nicht hin -> erledigt
-
Hallo, seit dem letzten Update des JS funktioniert meine Funktion für Zugriff auf Fritzbox-Api nicht mehr. Mit dem Codeblock aus einem anderen Script hatte ich mir eine Funktion gebastelt, die Telefone stummzuschalten. Es wäre nett, wenn mir jemand helfen würde (gern auch ohne axois zu verwenden).
Node.js: v20.19.4
NPM: 10.8.2(10.9.4)
JS: 9.0.11original-Code-Block, hatte jahrelang funktioniert
TypeError: axios is not a function// Get the SID from the Fritzbox async function getFbSid2() { if (FbDebugging){log("function getFbSid2");} axios({ method: "post", url: 'http://' + FbIp, data: secLogin, headers: headers }) .then(function(response) { //log(response.headers); log(response.status); if (response.status == 200 && response.data){ try { secSid = response.data.match(/\"sid\":\"(.*)\"/)[1]; //log ("w: "+secSid) } catch (e) { if (secSid == undefined) { //log(response.data); log("b: "+"Your login was not successful. End Script: "+e, "error") return; } } if (FbDebugging){log(" > SID : " + secSid);} toggle_tel(); } else { log ("error, status: "+response.status); if (response.data) { log(response.data); } } }); }einer meiner Bastelversuche, offenbar kommt kein response.data mehr
TypeError: Cannot read properties of null (reading '1')// Get the SID from the Fritzbox async function getFbSid2() { if (FbDebugging){log("function getFbSid2");} axios.post('http://' + FbIp,{data: secLogin, headers: headers,}) .then(response => { //log("head: "+response.headers); log("status: "+response.status); if (response.status == 200 && response.data){ try { secSid = response.data.match(/\"sid\":\"(.*)\"/)[1]; //log ("w: "+secSid) } catch (e){ if (secSid == undefined) { //log(response.data); log("b: "+"Your login was not successful. End Script: "+e, "error") return; } } if (FbDebugging){log(" > SID : " + secSid);} toggle_tel(); } else { log ("error, status: "+response.status); if (response.data) { log(response.data); } } }); } -
Um axios verwenden zu können, muss es im Script zunächst mal bekannt gemacht werden.
const axios = require('axios').default;Wenn Du das komplett ohne axios umbauen willst, hilft Dir vielleicht das folgende Beispiel:
function sendZabbix(itemId, content) { const payload = { "jsonrpc": "2.0", "method": "history.push", "params": [{ "itemid": itemId, "value": content }], "id": 1 }; const options = { headers: { 'Content-Type': 'application/json-rpc', 'Authorization': `Bearer ${apiKey}` }}; httpPost(zabbixUrl, payload, options, function(error, response) { if (error) { console.error(error); } else if (response) { console.log(response); } }); }; -
danke, wirft aber sofort:
SyntaxError: Identifier 'axios' has already been declaredmit dem abgewandelten Beispielcode erhalte ich
statusCode: 200,
data: 'getcgivars(): Unsupported Content-Type.\n',async function getFbSid2() { const options = { data: secLogin, headers: headers }; httpPost('http://' + FbIp, options, function(error, response) { if (error) { console.error(error); } else if (response) { console.log(response); } }); };Nachtrag, weil wohl wichtig in diesem Zusammenhang:
var headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'curl/7.64.0', 'Accept': '*/*' }; -
danke, wirft aber sofort:
SyntaxError: Identifier 'axios' has already been declaredmit dem abgewandelten Beispielcode erhalte ich
statusCode: 200,
data: 'getcgivars(): Unsupported Content-Type.\n',async function getFbSid2() { const options = { data: secLogin, headers: headers }; httpPost('http://' + FbIp, options, function(error, response) { if (error) { console.error(error); } else if (response) { console.log(response); } }); };Nachtrag, weil wohl wichtig in diesem Zusammenhang:
var headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'curl/7.64.0', 'Accept': '*/*' };@alka sagte in axios - bekomme code-Änderung nicht hin:
statusCode: 200
Heißt ja zunächst mal: Alles paletti!
Du zeigst aber auch immer nur die eine Funktion.
Wie sinddataundheadersdefiniert?
Was soll da zurückkommen? -
@alka sagte in axios - bekomme code-Änderung nicht hin:
statusCode: 200
Heißt ja zunächst mal: Alles paletti!
Du zeigst aber auch immer nur die eine Funktion.
Wie sinddataundheadersdefiniert?
Was soll da zurückkommen?ich konnte etwas finden, habe mich schamlos bedient und mir die Funktion recht plump neu zusammengeschustert: https://forum.iobroker.net/post/1191263
(das erspart mir langwieriges code zerlegen und Try&Error, um es auf die bisherige Art ans laufen zu bekommen)Der Teil, welcher in meinem script in der FB die Klingelsperre (de)aktiviert läuft damit wieder problemlos (und der Rest der 400 Zeilen Code macht sowieso keine Probleme)
const crypto = require("node:crypto"); // FritzBox URL const fritzURL = "http://192.168.1.1"; // FritzBox Credentials const fritzBenutzer = "benutzer"; const fritzPasswort = "passwort"; let sessionID = '0000000000000000'; // Abzufragende URLs der FritzBox const loginURL = fritzURL + "/login_sid.lua?username=" + fritzBenutzer; const dataURL = fritzURL + "/data.lua"; let tel_soll=true; let pause=false; async function getSid() { const tstChallenge = new RegExp(/<Challenge>([a-f0-9]{8})<\/Challenge>/); const tstSid = new RegExp(/<SID>([a-f0-9]{16})<\/SID>/); let challenge = ''; let sid = ''; let response = await httpGetAsync(loginURL); if (response.statusCode === 200) { if (tstChallenge.test(response.data)) { challenge = response.data.match(tstChallenge)[1]; } } else throw new Error('Fehler beim Holen der Challenge!'); const utf16le_encoded = Buffer.from(`${challenge}-${fritzPasswort}`, "utf-16le"); const challengeResponse = crypto.createHash("md5").update(utf16le_encoded).digest("hex"); const options = { headers: { "Content-Type": "application/x-www-form-urlencoded", }, }; const data = { response: `${challenge}-${challengeResponse}`, username: `${fritzBenutzer}` }; response = await httpPostAsync(loginURL, data, options); if (response.statusCode === 200) { if (tstSid.test(response.data)) { sid = response.data.match(tstSid)[1]; } } else throw new Error('Fehler beim Holen der sid!'); if (sid) return sid; } function endPause(){ pause=false; } async function toggle_tel(tel_soll) { if (!sessionID || sessionID === '0000000000000000') { sessionID = await getSid(); } const config = { timeout: 30000, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }; let fons=[1] let req={}; for (let num in fons){ if (tel_soll){ log("set tel aus"); req={xhr: 1, sid: sessionID, lang: 'de', no_sidrenew: null, page: 'edit_dect_ring_block', idx: fons[num], lockmode: 0, nightsetting: 1, lockday: 'everyday', starthh: '00', startmm: '00', endhh: '24', endmm: '00', apply: "ok"};//&nightsetting=1&lockday=everyday&lockday=everyday&starthh=01&startmm=00&endhh=23&endmm=55 } else { log("set tel ein"); req={xhr: 1, sid: sessionID, lang: 'de', no_sidrenew: null, page: 'edit_dect_ring_block', idx: fons[num],lockmode: 1, apply: "ok"}; } let resp = await httpPostAsync(dataURL, req, config); if (resp.statusCode === 200) { log("tel ok"); } else { log("tel error"); } } } on({id:'0_userdata.0.wohnung.ruhe', change: "ne"}, function (obj) { if (!pause){ tel_soll=obj.state.val; toggle_tel(tel_soll); pause=true; setTimeout(function() {endPause()},1000); } else { log ("ruhetaste zu schnell doppelt betätigt"); } }); -
Hallo zusammen,
ich habe ein ähnliches Problem....
weiss evtl jemand, was da passiert ist, bzw. wie ich axios (und anscheinend ein paar andere) weiter nutzen kann?
ich wollte eigentlich nicht alles umbauen....
im changelog ist ja kein entsprechender breaking change vermerkt, insofern scheint das ein Kollateralschaden zu sein....
Viele Grüße
Christoph -
Hallo zusammen,
ich habe ein ähnliches Problem....
weiss evtl jemand, was da passiert ist, bzw. wie ich axios (und anscheinend ein paar andere) weiter nutzen kann?
ich wollte eigentlich nicht alles umbauen....
im changelog ist ja kein entsprechender breaking change vermerkt, insofern scheint das ein Kollateralschaden zu sein....
Viele Grüße
Christoph@chris299 sagte in axios - bekomme code-Änderung nicht hin -> erledigt:
im changelog ist ja kein entsprechender breaking change vermerkt
Wenn Du den Javascript-Adapter aktualisiert hast, ist da sehr wohl ein "breaking change" vermerkt:
requestist nicht mehr "deprecated" sondern wurde inzwischen komplett entfernt.Wenn Du auch zeigst wo Dein Problem liegt, kann man Dir möglicherweise sogar helfen ;-)
-
@codierknecht den breaking change zu request habe ich schon gesehen, aber axios hat damit ja eigentlich nichts zu tun, oder?
Ich hatte genau die gleiche Meldung wie @alka : "axios is not a function".
tatsächlich funktioniert es nun wieder und ich weiss nicht, warum....
ich habe zwei andere Module noch zusätzlich in die Adapter config geschrieben, weil ich dachte, dass die evtl. nun auch fehlen und danach lief es seltsamerweise wieder....