augustq: Javascript: getData() liest von Server - wie lese ich diese Daten aus einer Datei?

Hi,

vorab gesagt: ich kann kein Javascript, programmieren aber schon.

Ich habe hier ein umfangreiches Programm in Javascript, das an einer Stelle Daten von einem Server holt. Das ist vermutlich diese Zeile:

ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {

Dabei werden aber immer die aktuellen Daten geholt, aber ich will mit älteren Daten arbeiten. Diese Daten habe ich, sie liegen auf der Platte. Nun passe ich einfach obige Zeile an, dachte ich mir. So dachte ich mir das:

fetch("/home/august/Silvester/2020/luftdaten_00721/Map\ Sensor.Community-Daten/data.dust.min.json", 1).then((function(t) {

Klappt aber nicht, die Daten werden nicht angezeigt. Wie mache ich das richtig?

Ich vermute, daß die Daten in diese Variable ms gehören und die Zuweisung in meinem Teilstück fehlt. Wie mache ich dies?

Schönen Gruß AugustQ

PS: das ist die gesamt Funktion:

		function e() {
			ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {
				Ts = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(1), ms.getData(Us + "/data/v2/data.24h.json", 2).then((function(t) {
					ks = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(2)
				})), ms.getData(Us + "/data/v2/data.temp.min.json", 3).then((function(t) {
					Ss = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(3)
				})), ms.getData(Us + "/data/v1/data.noise.json", 4).then((function(t) {
					As = t.cells, t.timestamp > Es && (Es = t.timestamp, Is = t.timestamp_from), eu(4)
				}))
			}))
		}
.......

  1. Hallo,

    ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {
    

    … Nun passe ich einfach obige Zeile an, dachte ich mir. So dachte ich mir das:

    fetch("/home/august/Silvester/2020/luftdaten_00721/Map\ Sensor.Community-Daten/data.dust.min.json", 1).then((function(t) {
    

    was lässt dich glauben, das ms.getData und fetch das gleiche machen?

    Sind das Leerzeichen vor Sensor und der \ so im Dateinmen?

    Liegen die Daten auf dem Server oder auf deinem PC (/home/…)?

    PS: das ist die gesamt Funktion:

    Wie sieht denn ms.getData aus?

    Gruß
    Jürgen

    1. erste Antwort: ich habe eine Fehlermeldung gefunden:

      Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf file:///home/august/Silvester/2020/original/modified/~/Silvester/2020/original/modified/Map-Sensor.Community-Dateien/data.dust.min.json. (Grund: CORS-Anfrage war nicht http).

      Mit dem Pfad habe ich etwas gespielt, daran liegt es nicht.

      Nun sagt mir dies mal gar nichts......

      1. Hallo,

        dann liegen die Daten wohl auf deinem PC. Mit einem Update Mitte 2019 (?) hat der FF als letzter Browser den Zugriff von lokalen HTML auf lokale Dateien unterbunden. Abhilfe liefert eine Umkonfiguration des Firefox:

        about:config öffnen
        security.fileuri.strict_origin_policy auf false setzen

        Ob und wie das bei anderen Browsern geht, weiß ich nicht, und welche Risiken damit verbunden sind, kann ich nicht abschätzen.

        Gruß
        Jürgen

      2. zweite Antwort.

        ja, da sind Leerzeichen im Pfadnamen. Unschön, lässt sich aber jetzt nicht ändern.

        Die Datei main.js hat einen Umfang von fast 15.000 Zeilen und stammt nicht von mir. Ich will doch nur eine Kleinigkeit anpassen.

        Die Dateien liegen lokal auf der Platte meines PCs.

        In der datei main.js fand ich diese Zeile:

        	var ms = _s;
        
        

        Eine Funktion getData() ist 3x definiert, aber nie für die Variable ms, auch nicht für _s.

        1. Danke für den Hinweis auf die Konfiguration. Ich habe da mal geändert.

          Jetzt sehe ich immer noch nicht die Daten.

          2 Punkte: #1 mit der Zeile ms.getData(Us + "/data/v2/data.dust.min.json", 1).then((function(t) {

          werden Daten vom Server in die Variable ms gelesen (mein Verständnis). Wenn ich sie von Platte lese müssen sie ja auch in diese Variable rein, damit sie weiter verarbeitet werden können. Wie mache ich das?

          #2 in der Konsole sehe ich jetzt einen Hinweis auf die Datei matomo.js, die nicht geladen werden kann. Bei der Originalseite wird diese Datei von meinem Adblocker geblockt wird. Scheint aber nicht zu fehlen.

          1. Hallo,

            ohne zu wissen, was getData macht, ist Hilfe natürlich schwierig.

            Benutzt du denn jetzt wieder getData oder fetch?

            Ich würde den Wert

            Us + "/data/v2/data.dust.min.json"

            durch den neuen Dateinamen ersetzen und dann sehen, welche Meldung in der Konsole kommt.

            Gruß
            Jürgen

        2. Hi there,

          In der datei main.js fand ich diese Zeile:

          	var ms = _s;
          
          

          Eine Funktion getData() ist 3x definiert, aber nie für die Variable ms, auch nicht für _s.

          Das glaub ich nicht. getData() kann nicht 3x definiert sein, kann eigentlich gar nicht definiert sein, weil es eine implementierte Methode des Web-Apis ist (siehe da)

          Und ms ist keine Variable, sondern ein Objekt, auf das die Methode getData angewandt wird.

          Der eigentliche Grund aber, warum es bei Dir nicht funktioniert (ohne es jetzt überprüft zu haben, ich hab den thread nur überflogen) ist aber vermutlich der, weil Du direkt auf das Dateisystem zugreifen möchstest...

          1. Hallo klawischnigg,

            (siehe da)

            das glaube ich nicht. Auf dem Rückgabewert der getData Methode wird .then aufgerufen, das klingt vielversprechend...

            Der/die/das von Dir verlinkte API liefert einen DOMString, kein Promise. Es ist natürlich nicht auszuschließen, dass irgendein Spaßvogel eine then Methode auf String.prototype definiert hat, aber Herrn Ockhams Rasierklinge sagt: eher nicht.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hi there,

              (siehe da)

              das glaube ich nicht. Auf dem Rückgabewert der getData Methode wird .then aufgerufen, das klingt vielversprechend...

              Der/die/das von Dir verlinkte API liefert einen DOMString, kein Promise. Es ist natürlich nicht auszuschließen, dass irgendein Spaßvogel eine then Methode auf String.prototype definiert hat, aber Herrn Ockhams Rasierklinge sagt: eher nicht.

              ok, Einsicht folgt dem Widerspruch. Ich kannte getData() nicht, mir ist nur aufgefallen, daß das in der Sourcecode-Darstellung farblich markiert war, deswegen dachte ich, daß das eine implementierte Methode ist und hab dann den verlinkten Eintrag gefunden.

              Gleichwohl kann ich mir trotzdem nicht vorstellen, daß getData() dreimal definiert wird...

              1. Hallo klawischnigg,

                Gleichwohl kann ich mir trotzdem nicht vorstellen, daß getData() dreimal definiert wird...

                doch, kann ich schon. Auf unterschiedlichen Objekten, als Helper für irgendwas, als unterschiedliche fachliche Kapseln um das Ajax-Toolkit - warum nicht. Polymorphie hat viele Formen...

                Die Frage ist, ob eine dieser Methoden die ist, die im gezeigten Code aufgerufen wird. August hat ja dem Anschein nach nicht wirklich verstanden, wie dieses Scriptmonster tickt, und die Seite, die er publiziert, ist eine andere, so dass unsereins nicht erproben kann, ob man schlauer ist oder genauso verwirrt.

                Rolf

                --
                sumpsi - posui - obstruxi
  2. Hallo augustq,

    Ich will doch nur eine Kleinigkeit anpassen.

    Nein. Das denkst Du nur. Du willst von Same Origin auf Cross Origin Zugriff umstellen. Und das ist angesichts der stetig wachsensen Security Hürden, die Browser für böswillige Webseiten aufbauen, überhaupt nicht trivial.

    Wenn der von Jürgen genannte FF Schalter ausreicht, um die Sperre freizugeben, dann könntest Du eine Chance haben. Aber ich glaube es noch nicht. Dieser Schalter dürfte relevant sein, wenn Du eine HTML Seite von file:/// lädst und auf file:/// Ressourcen zugreifen willst - was vom Browser bereits als cross origin Zugriff gesehen wird.

    Eine HTTP-Seite, die aus dem wilden weiten Web oder auch nur aus dem Intranet kommt, darf niemals nicht auf file:/// Ressourcen zugreifen. So vertrauenswürdig kann man eine Seite überhaupt nicht einstellen, dass das geht. Bedank Dich bei den Internet-Vandalen der letzten Jahrzehnte, die diese Paranoia nötig machen.

    Was gehen könnte, ist ein lokaler Apache, der die Ressourcen über http://localhost bereitstellt. Darin kannst Du dann mittels .htaccess die passenden CORS Header setzen, die einen Cross Origin Zugriff von www.example.org (ersetze mit deiner Datenquelle) zulässt.

    Ich habe allerdings CORS nicht wirklich kapiert und weiß nicht, wie das geht und ob das reicht.

    Zum Zugriff selbst: Was da passiert, ist hinreichend gruselig. Es sind vier getData-Zugriffe, schön hintereinander ausgeführt, und jeder führt auf eine Callback-Funktion. Das alles in minifiziertem und uglifiziertem Code, dessen Lesbarkeit vorsätzlich auf 0 gepresst ist.

    In ms stehen nicht die Daten, sondern da dürfte man das Toolkit finden, das die getData Methode für den Ajax-Zugriff bereitstellt. Von getData kommt ein Promise zurück, das bei Eintreffen der Daten diese an die mittels .then() übergebene Callback-Funktion übergibt. Die nimmt sie dann im Parameter t entgegen.

    Das kannst Du nicht so einfach auf fetch umbiegen, weil fetch zwar auch die Promise-Technik nutzt, aber zweistufig arbeitet. Der erste Callback bekommt die HTTP Response und muss darauf eine Methode aufrufen, die die Daten ins gewünschte Format bringt. Die liefert dann ein neues Promise, und darauf reagiert man mit einem zweiten .then.

    TL;DR: Vergiss fetch, bleib bei ms.getData und ändere die URL. Wenn file:/// nicht geht, probier's mit einem lokalen Apache und http://localhost.

    Rolf

    --
    sumpsi - posui - obstruxi
  3. Hi,

    das Problem ist gelöst, denke ich zumindest. Falls nicht komme ich doch noch mal auf diese Frage zurück.

    Danke an alle, die hier mitdiskutiert haben.

    Schritt #1:

    about:config öffnen security.fileuri.strict_origin_policy auf false setzen

    das habe ich gemacht. Jetzt darf ich nicht vergessen, das später wieder zurückzusetzen.

    Schritt #2:

    in der Javascript-Datei muß es heißen:

    ms.getData("file:///home/august/Silvester/2020/luftdaten_00721/Map%20Sensor.Community-Dateien/data.dust.min.json", 1).then((function(t) {

    d.h. der Zugriff per URL auf den Server wird ersetzt durch den zugriff auf die lokale Datei.

    Jetzt kann ich weiter arbeiten.

    Nochmals vielen Dank für die Unterstützung.

    AugustQ

    1. Hi,

      Danke für die Unterstützung, die habe ich auch gebraucht.

      Das war das Projekt: Silvester und Böllerverbot

      Dort findest Du auch den entstandenen Film.

      Schönen Gruß AugustQ

      1. Hallo augustq,

        This site uses cookies from Google to deliver its services and to analyze traffic. Your IP address and user-agent are shared with Google along with performance and security metrics to ensure quality of service, generate usage statistics, and to detect and address abuse.

        Lies die EU Datenschutzrichtlinien. Wo ist der opt-in Dialog? Du machst Dich strafbar.

        Rolf

        --
        sumpsi - posui - obstruxi