NEWS
Socket.io / File lesen / Cache Problem
-
Ich schreibe gerade an einem Adapter ähnlich VIS, bei mir ist quasi das meiste vom Adapter Frontend (www Ordner) - viel Adapterlogik selbst gibt es nicht.
Nun will ich im Frontend des Adapters ein File lesen. Z.b. eine config.json wo die vom Benutzer getätigten Eingaben gespeichert werden. Ich nutzen dazu den SocketIO Adapter, der auf Port 8084 läuft. Für die Kommunikation nutze ich die Routinen aus dem VIS Adapter (conn.js) - aber das nur nebenbei
Diese sollten also funktionieren.
Ich lese die Datei über den Pfad "/adapterinstanz.0/config.json" was auch gut funktioniert. Das ganze liegt natürlich in "/iobroker/iobroker-data/files/" so wie es sein sollte. Bei lesen mit readFile greift dann allerdings irgendwie ein Cache und es scheint nicht der Browsercache zu sein. Wenn ich nämlich die config.json mit dem Editor mal modifiziere und hochlade und mir den rückgelieferten Inhalt per console.log dann wir mir nur der alte angezeigt. Dies geht soweit, dass ich die config.json sogar löschen kann und mir readFile immer noch den Inhalt ausgibt. Ein Löschen des Browsercaches bringt keine Veränderung. Erst wenn ich das File direkt im Browser mit "http://localhost:8082/adapterinstanz.0/config.json" aufrufe werden danach Änderungen in der Routine erkennt (File nicht mehr da oder geändert o.ä.).
Das Thema mit dem Cache taucht selten hier und wieder auch mal im Forum oder im Web auf - leider ohne Lösung. Hat jemand eine Idee? Vielleicht auch die Profis, die an VIS oder SocketIO beteiligt waren und die readFile Routinen geschrieben haben.
Wie gesagt, funktionieren tut alles - nur das "Cache" Problem ist da...
Danke!
Es tut wahrscheinlich nicht viel zu Sache aber nachfolgend noch die Funktion aus dem VIS Adapter welche die Funktion in Verbindung mit SocketIO zur Verfügung stellt...
readFile: function (filename, callback, isRemote) { if (!callback) throw 'No callback set'; if (this._type === 'local') { try { var data = storage.get(filename); callback(null, data ? JSON.parse(storage.get(filename)) : null); } catch (err) { callback(err, null); } } else { if (!this._checkConnection('readFile', arguments)) return; if (!isRemote && typeof appiob !== 'undefined' && !appiob.settings.dontCache) { appiob.readLocalFile(filename.replace(/^\/vis\.0\//, ''), callback); } else { var adapter = this.namespace; if (filename[0] === '/') { var p = filename.split('/'); adapter = p[1]; p.splice(0, 2); filename = p.join('/'); } this._socket.emit('readFile', adapter, filename, function (err, data, mimeType) { setTimeout(function () { callback(err, data, filename, mimeType); this._socket.emit('closeFile', adapter, filename, function (err, data, mimeType) { }); }, 50); }); } } },
-
@snador das klingt für mich als würdest du kein Adapter Upload machen nachdem du die Datei geändert hast.
-
@Jey-Cee Wenn ich per FTP das File testweise direkt im Data Verzeichnis des ioBroker ändere, muss ich dann wirklich noch nen Upload machen? Es ist doch schon der reale Platz wo geschrieben wird. Wenn ich im Adapter-Frontend per writeFile ein File schreibe dann wir doch auch direkt im Data Verzeichnis / Adapterinstanz.0 geschrieben... Dann wird ja auch kein Upload gemacht... Oder?
-
Um das nochmal zu definieren. Die config.json ist keine Datei, die ich schreibe und dann per Upload hochladen muss, sondern in der Datei werden Einstellungen gespeichert, die der Benutzer des Adapters im Adapter-Frontend (www Folder) getätigt hat.
Wenn jemand von den Wissenden einen Idee hat
Immer her damit, ich weiß nicht so recht wo ich weitermachen muss um das Problem zu umgehen. Zudem würde mich interessieren wie dieser Effekt zustande kommt. Danke!
-
Ich habe das nochmal unter Windows getestet und würde es gerne verstehen. Der ioB ist unter C:\iobroker\ installiert. Das File liegt unter iobroker-data\files\adaptername.0\config_user.json. Diese File kann ich im Browser unter http://localhost:8082/adaptername.0/config_user.json aufrufen und er zeigt mir den Inhalt im Browser. Wenn ich das File lösche kann ich es weiterhin aufrufen. Das macht mich wahnsinnig
Ich versteh es einfach nicht...
Kann mir bitte jemand auf die Sprünge helfen...
Ich rekapituliere nochmal - bitte berichtigt mich wenn etwas falsch ist.
1: Ich habe einen Adapter, der liegt normalerweise ja unter iobroker/node_modules/adaptername
2: Ich machen einen upload mit: iobroker upload adaptername
3: Alle notwendigen Files für das Frontend werden beim Upload nach \iobroker\iobroker-data\files\adaptername\ kopiert
4: Ich erreiche mein Frontendt des Adapters normalerweise unter http://localhost:8082/adaptername/ z.B: index.html
5: Der Ort wo Dateien vom Frontend geschrieben werden, wird pro Instanz des Adapter angelegt: \iobroker\iobroker-data\files\adaptername.0
6: Ein File (config_user.json) was dort geschrieben wurde (\iobroker\iobroker-data\files\adaptername.0\config_user.json) erreiche ich über den Browser unter http://localhost:8082/adaptername.0/config_user.json => wenn ich readFile oder writeFile per socketio nutze reicht natürlich die Adapterinstanz und der FilenameWie kann der oben beschriebene Effekt zustand kommen? Der Browsercache ist es definitiv nicht...
HELP!