NEWS
JSON Input in Datei ergänzen
-
Hallo,
ich habe folgenden Node-Red Flow:
Dabei kann zu Anfangs die Datei Werte.json eine komplett leere Datei sein. Die Funktion sollte nun die sein, dass die Datei eingelesen wird und anschließend der Input JSON der Datei hinzugefügt wird. Sollte ein weiteres Input kommen, wird er auch der Datei hinzugefügt. Am Ende soll eine gültige JSON Datei enstehen, welche wieder an einer anderen Stelle mit all den Input JSON Objekten eingelesen werden kann.
Wie sieht dazu die Funktion aus?
Ich habe dazu auch mal folgende Function Node verwendet (zu meiner Schande hat hier auch ChatGPT mitgeholfen):
// Neue Daten (als JSON-Objekt) let newData = msg.payload; // Bestehende Daten aus der Datei (falls vorhanden) let existingData = msg.payload || '[]'; // Falls Datei leer ist, auf leeres Array setzen // Versuche, die bestehenden Daten zu parsen let jsonData; try { jsonData = JSON.parse(existingData); if (!Array.isArray(jsonData)) { // Falls die Datei kein Array ist, setzen wir es auf ein leeres Array jsonData = []; } } catch (error) { // Falls die Datei nicht geparst werden kann (z.B. leer oder ungültig), setzen wir auf ein leeres Array jsonData = []; } // Füge die neuen Daten dem Array hinzu jsonData.push(newData); // Konvertiere das Array in einen JSON-String msg.payload = JSON.stringify(jsonData, null, 2); // 2 für besser lesbares Format return msg;
Allerdings wird dann die leere Datei nur wie folgt beschrieben:
[
""
]An der Stelle weiß ich auch nicht weiter, wie ich hier vorgehen muss und wo genau der Fehler ist?
@mickym evtl. weißt du oder jemand anders hier rat :)?Vielen Dank
-
@_r_a_l_f_
so ganz logisch ist die Funktion nicht.
du bekommst den payload und speicherst ihn in newdata.
Dann nimmst du wieder den payload und speicherst ihn in existingData.
Dann prüfst du ob existingData leer ist und initialisiert es als Array.
Dann fügst du dann newData hinzu.
um das Ergebnis zu erhalten, dass du zeigst, müsste newData einen leeren String enthalten.wo sollte deiner Meinung nach exustingData herkommen?
-
@oliverio ja manchmal sieht man wirklich den Wald vor lauter Bäumen nicht und ja, genau das ist das eigentlich Problem. Ich lese eine leere Datei ein und zusätzlich die neuen Daten. Jedoch werden die neuen Daten nie an die Function übergeben. Somit werden dadurch natürlich auch keine neuen Datensätze eingefügt
Ich hab jetzt vor dem Input und dem Fileinput eine join Node gepackt und den Code in der Function Node wie folgt abgeändert und jetzt klappt es (welch Wunder) auch :D:
Aber Danke für den Hinweis
Hier noch der korrigierte Code der Function Node
// Bestehende Daten aus der Datei let existingData = msg.payload.file; // Neue Daten vom HTTP Request let newData = msg.payload.feedback; // Falls die Datei leer oder ungültig ist, setzen wir die bestehenden Daten auf ein leeres Array if (!existingData || existingData.trim() === "" || existingData === '""') { existingData = '[]'; } // Versuche, die bestehenden Daten zu parsen let jsonData; try { jsonData = JSON.parse(existingData); if (!Array.isArray(jsonData)) { // Falls die Datei kein Array ist, setzen wir es auf ein leeres Array jsonData = []; } } catch (error) { // Falls die Datei nicht geparst werden kann (z.B. leer oder ungültig), setzen wir auf ein leeres Array jsonData = []; } // Füge die neuen Daten dem Array hinzu jsonData.push(newData); // Konvertiere das Array in einen JSON-String msg.payload = JSON.stringify(jsonData, null, 2); // 2 für besser lesbares Format return msg;
-
Ja - der Code ist Käse - ausserdem überschreibst Du ja mit deinem Einlesen der Datei deine Daten. Ich verstehe einfach nicht, warum man immer wieder versucht zu codieren, anstatt einen Flow zu basteln.
Hier mal ein Flow - als Vorschlag.
Ich habe den Flow mal so gebastelt, dass die vorhandene Datei NUR 1 mal eingelesen wird und bei jedem Update geschrieben wird, das vermindert diesen I/O Verkehr
Hier der Flow:
Die Pfade zu der Datei musst halt wieder auf Windows und Deinen Pfad anpassen.
-
Zeile 8, 9,10 kannst du dir eigentlich sparen.
Das wird schon durch das try/catch Konstrukt erledigt. -
@oliverio sagte in JSON Input in Datei ergänzen:
Zeile 8, 9,10 kannst du dir eigentlich sparen.
Danke für den Tipp
-
@mickym sagte in JSON Input in Datei ergänzen:
Ich verstehe einfach nicht, warum man immer wieder versucht zu codieren, anstatt einen Flow zu basteln.
Danke dir für den Ansatz. Auf das wäre ich gar nicht gekommen, dass ich es so auch umsetzen kann. Daher leider Ansatz mit dem codieren
-
@_r_a_l_f_ sagte in JSON Input in Datei ergänzen:
Daher leider Ansatz mit dem codieren
Na meine Meinung hierzu kennst Du ja. Insbesondere da der Flow nicht kompliziert ist und ich das Einlesen der Datei bei jedem Update unnötig finde, aber letztlich musst Du selbst wissen, was Dir wichtig ist. Chat GPT wird Dir in der Regel immer Code vorschlagen, da NodeRed als grafisches Tool genau das Gegenteil ist, was Chat GPT kann.