Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. javascript-Adapter bindet console.log nicht ein bei require

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.0k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

javascript-Adapter bindet console.log nicht ein bei require

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
13 Beiträge 3 Kommentatoren 535 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • A Offline
    A Offline
    Axel21
    schrieb am zuletzt editiert von Axel21
    #1

    Im iobroker Javascriptadaper habe ich viele Skripts, die Funktionen z.B. "function1" verwenden.
    In die "globalen Skripte (global)" sollen sie nicht hinein, da sind dann ja vor jedes Skript eingebunden werden und hier im Forum mehrfach auf die Speicherproblematik hingewiesen wurde.

    Die Methoden sind ausgelagert in die Datei modneu.js, darin zwei Consolenmeldungen zum debuggen.

    function function1 (a){
              // do some stuff
              console.log('console.log innerhalb function1');
              console.debug('console.debug innerhalb function1');
            return a+1;
        }
    exports.function1 = function1;
    

    Aufruf in main.js:

    foo = require('../../../iobroker-data/modules/modneu.js');
    console.log(foo.function1(9));
    

    Nach dem Neustart des javascripts-Adapters (nach jeder Änderung von modneu.js!) zeigt die javascriptkonsole nur die Ausgabe "10" also 9+1.
    Die Consolen-Logs zum debuggen innerhalb der requirefunktion werden nicht angezeigt.

    Nun habe ich hier im Forum gelernt, dann man iobroker-Befehle im require-scope nur nutzen kann, in dem man als zusätzlichen Parameter der Funktion this oder globalThis mit übergibt. Dies ist für mich eine gute Lösung, wenn ich iobroker-spezifische Befehle wie setState verwenden möchte.

    function function1 (a, this1){
              // do some stuff
              this1.console.log('console.log innerhalb function1');
              this1.console.debug('console.debug innerhalb function1');
            return a+1;
        }
    exports.function1 = function1;
    

    Übergabeparameter jetzt (9, this) in main.js:

    foo = require('../../../iobroker-data/modules/modneu.js');
    console.log(foo.function1(9, this));
    

    Jedoch: console.log ist ein Standard-Befehl von node.js. Dieser Befehl wird vermutlich innerhalb der javascript-adapters so umgelenkt, dass die Ausgabe schön unterhalb des Scriptfensters in iobroker zu sehen ist. Im scope von require gibt es also dieses sinnvolle adapter-spezifische console.log() nicht mehr.

    Vermutlich wird ohne this im ersten Fall eine andere console.log verwendet, die aber nicht in das iobroker-Fenster weiterleitet. Nur, wohin gehen die logs, wo kann ich den debug-Ausdruck irgendwo sonst finden?

    Bei node.js werden die console.log() Ausgaben standardmäßig auf stdout geschrieben. Daher habe ich mit: systemctl stop iobroker und dann iobroker von hand über node gestartet und die Standardausgabe von node ansehen. Negativ, ebenso keine zusätzlichen logfiles in /opt/iobroker/log. Andere logfiles habe ich nicht gefunden.

    Ich bin unsicher, ob das ein Bug ist, weil im wrapper der require-funktion die neue console.debug/info/... -Funktionen noch nicht mit eingebunden wurden und somit kein debuggen mit console.log möglich ist. Oder ist das richtig so und obiges Verhalten einfach die Konsequenz, wenn man require verwenden will, weil man keine globalen Skripte wegen des Speicherplatzes möchte?

    Oder gibt es eine einfache Lösung, die ich übersehen habe?
    Tks!

    T OliverIOO 2 Antworten Letzte Antwort
    0
    • A Axel21

      Im iobroker Javascriptadaper habe ich viele Skripts, die Funktionen z.B. "function1" verwenden.
      In die "globalen Skripte (global)" sollen sie nicht hinein, da sind dann ja vor jedes Skript eingebunden werden und hier im Forum mehrfach auf die Speicherproblematik hingewiesen wurde.

      Die Methoden sind ausgelagert in die Datei modneu.js, darin zwei Consolenmeldungen zum debuggen.

      function function1 (a){
                // do some stuff
                console.log('console.log innerhalb function1');
                console.debug('console.debug innerhalb function1');
              return a+1;
          }
      exports.function1 = function1;
      

      Aufruf in main.js:

      foo = require('../../../iobroker-data/modules/modneu.js');
      console.log(foo.function1(9));
      

      Nach dem Neustart des javascripts-Adapters (nach jeder Änderung von modneu.js!) zeigt die javascriptkonsole nur die Ausgabe "10" also 9+1.
      Die Consolen-Logs zum debuggen innerhalb der requirefunktion werden nicht angezeigt.

      Nun habe ich hier im Forum gelernt, dann man iobroker-Befehle im require-scope nur nutzen kann, in dem man als zusätzlichen Parameter der Funktion this oder globalThis mit übergibt. Dies ist für mich eine gute Lösung, wenn ich iobroker-spezifische Befehle wie setState verwenden möchte.

      function function1 (a, this1){
                // do some stuff
                this1.console.log('console.log innerhalb function1');
                this1.console.debug('console.debug innerhalb function1');
              return a+1;
          }
      exports.function1 = function1;
      

      Übergabeparameter jetzt (9, this) in main.js:

      foo = require('../../../iobroker-data/modules/modneu.js');
      console.log(foo.function1(9, this));
      

      Jedoch: console.log ist ein Standard-Befehl von node.js. Dieser Befehl wird vermutlich innerhalb der javascript-adapters so umgelenkt, dass die Ausgabe schön unterhalb des Scriptfensters in iobroker zu sehen ist. Im scope von require gibt es also dieses sinnvolle adapter-spezifische console.log() nicht mehr.

      Vermutlich wird ohne this im ersten Fall eine andere console.log verwendet, die aber nicht in das iobroker-Fenster weiterleitet. Nur, wohin gehen die logs, wo kann ich den debug-Ausdruck irgendwo sonst finden?

      Bei node.js werden die console.log() Ausgaben standardmäßig auf stdout geschrieben. Daher habe ich mit: systemctl stop iobroker und dann iobroker von hand über node gestartet und die Standardausgabe von node ansehen. Negativ, ebenso keine zusätzlichen logfiles in /opt/iobroker/log. Andere logfiles habe ich nicht gefunden.

      Ich bin unsicher, ob das ein Bug ist, weil im wrapper der require-funktion die neue console.debug/info/... -Funktionen noch nicht mit eingebunden wurden und somit kein debuggen mit console.log möglich ist. Oder ist das richtig so und obiges Verhalten einfach die Konsequenz, wenn man require verwenden will, weil man keine globalen Skripte wegen des Speicherplatzes möchte?

      Oder gibt es eine einfache Lösung, die ich übersehen habe?
      Tks!

      T Nicht stören
      T Nicht stören
      ticaki
      schrieb am zuletzt editiert von
      #2

      @axel21

      benutze doch this.log()

      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

      Spenden

      A 1 Antwort Letzte Antwort
      0
      • A Axel21

        Im iobroker Javascriptadaper habe ich viele Skripts, die Funktionen z.B. "function1" verwenden.
        In die "globalen Skripte (global)" sollen sie nicht hinein, da sind dann ja vor jedes Skript eingebunden werden und hier im Forum mehrfach auf die Speicherproblematik hingewiesen wurde.

        Die Methoden sind ausgelagert in die Datei modneu.js, darin zwei Consolenmeldungen zum debuggen.

        function function1 (a){
                  // do some stuff
                  console.log('console.log innerhalb function1');
                  console.debug('console.debug innerhalb function1');
                return a+1;
            }
        exports.function1 = function1;
        

        Aufruf in main.js:

        foo = require('../../../iobroker-data/modules/modneu.js');
        console.log(foo.function1(9));
        

        Nach dem Neustart des javascripts-Adapters (nach jeder Änderung von modneu.js!) zeigt die javascriptkonsole nur die Ausgabe "10" also 9+1.
        Die Consolen-Logs zum debuggen innerhalb der requirefunktion werden nicht angezeigt.

        Nun habe ich hier im Forum gelernt, dann man iobroker-Befehle im require-scope nur nutzen kann, in dem man als zusätzlichen Parameter der Funktion this oder globalThis mit übergibt. Dies ist für mich eine gute Lösung, wenn ich iobroker-spezifische Befehle wie setState verwenden möchte.

        function function1 (a, this1){
                  // do some stuff
                  this1.console.log('console.log innerhalb function1');
                  this1.console.debug('console.debug innerhalb function1');
                return a+1;
            }
        exports.function1 = function1;
        

        Übergabeparameter jetzt (9, this) in main.js:

        foo = require('../../../iobroker-data/modules/modneu.js');
        console.log(foo.function1(9, this));
        

        Jedoch: console.log ist ein Standard-Befehl von node.js. Dieser Befehl wird vermutlich innerhalb der javascript-adapters so umgelenkt, dass die Ausgabe schön unterhalb des Scriptfensters in iobroker zu sehen ist. Im scope von require gibt es also dieses sinnvolle adapter-spezifische console.log() nicht mehr.

        Vermutlich wird ohne this im ersten Fall eine andere console.log verwendet, die aber nicht in das iobroker-Fenster weiterleitet. Nur, wohin gehen die logs, wo kann ich den debug-Ausdruck irgendwo sonst finden?

        Bei node.js werden die console.log() Ausgaben standardmäßig auf stdout geschrieben. Daher habe ich mit: systemctl stop iobroker und dann iobroker von hand über node gestartet und die Standardausgabe von node ansehen. Negativ, ebenso keine zusätzlichen logfiles in /opt/iobroker/log. Andere logfiles habe ich nicht gefunden.

        Ich bin unsicher, ob das ein Bug ist, weil im wrapper der require-funktion die neue console.debug/info/... -Funktionen noch nicht mit eingebunden wurden und somit kein debuggen mit console.log möglich ist. Oder ist das richtig so und obiges Verhalten einfach die Konsequenz, wenn man require verwenden will, weil man keine globalen Skripte wegen des Speicherplatzes möchte?

        Oder gibt es eine einfache Lösung, die ich übersehen habe?
        Tks!

        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von
        #3

        @axel21

        Es ist nur eine Vermutung:
        Zur Ausführung der Skript wird Node:vm verwendet.
        Darin ist mehr oder weniger alles gekapselt.
        Wahrscheinlich ist das console Objekt umgeleitet.
        Was aber in deinem Fall mit require dann wohl nicht mehr funktioniert.
        Ich habe leider vergeblich versucht im Source was zu finden.
        Es gibt noch den Log Befehl. Leider ist dieser in der adapterdokumentation häufig erwähnt, aber nicht dokumentiert. Versuche es mal damit.

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        1 Antwort Letzte Antwort
        0
        • T ticaki

          @axel21

          benutze doch this.log()

          A Offline
          A Offline
          Axel21
          schrieb am zuletzt editiert von
          #4

          @ticaki
          Vielen Dank für die schnelle Antwort.
          Im Hauptprogramm funktioniert log('logtext') mit der Ausgabe auf die iobroker - Console.

          Im require-scope funktioniert bei mir weder this.log('logtext') noch log('logtext').
          Beides Mal gibt es eine Fehlermeldung "this.log is not a function" bzw. "log is not a function".
          Unter node.js gibt es log(' ') nicht. Daher ist das Verhalten für mich nachvollziehbar.

          Anders als console.log ist log wohl eine rein iobroker-Funktion, die es im require-scope nicht mehr gibt.
          Daher funktionier this1.log('text'), genauso wie this1.console.log('text); im zweiten Beispiel.
          Aber dazu muss dann eben wieder this übergeben werden.

          Leider ist das keine Lösung. Danke dennoch!

          OliverIOO T 2 Antworten Letzte Antwort
          0
          • A Axel21

            @ticaki
            Vielen Dank für die schnelle Antwort.
            Im Hauptprogramm funktioniert log('logtext') mit der Ausgabe auf die iobroker - Console.

            Im require-scope funktioniert bei mir weder this.log('logtext') noch log('logtext').
            Beides Mal gibt es eine Fehlermeldung "this.log is not a function" bzw. "log is not a function".
            Unter node.js gibt es log(' ') nicht. Daher ist das Verhalten für mich nachvollziehbar.

            Anders als console.log ist log wohl eine rein iobroker-Funktion, die es im require-scope nicht mehr gibt.
            Daher funktionier this1.log('text'), genauso wie this1.console.log('text); im zweiten Beispiel.
            Aber dazu muss dann eben wieder this übergeben werden.

            Leider ist das keine Lösung. Danke dennoch!

            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von OliverIO
            #5

            @axel21

            Nach dem Beispiel von oben müsste es

            this1.log

            heißen.
            Log ist ein Befehl des JavaScript Adapters

            Hier der link zur typdefinition von Log
            https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/src/lib/javascript.d.ts#L1144

            Direkt darunter sieht man auch die Umleitung von console.
            Also ist console nun auch Bestandteil des globalen Objekts

            Wenn du vor console immer dein this1 davor schreibst funktioniert es.

            Also
            this1.console.log(.....

            Das Konzept nennt sich shadowing
            https://www.geeksforgeeks.org/javascript/variable-shadowing-in-javascript/

            In JavaScript ist ja nix geschützt. Auch interne Funktionen können überschrieben werden oder erweitert werden. Da gibt es schöne Beispiele wie bspw das String Objekt mit weiteren Funktionen erweitern , die exakt so angewendet werden können wie die bereits eingebauten.

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            A 1 Antwort Letzte Antwort
            0
            • A Axel21

              @ticaki
              Vielen Dank für die schnelle Antwort.
              Im Hauptprogramm funktioniert log('logtext') mit der Ausgabe auf die iobroker - Console.

              Im require-scope funktioniert bei mir weder this.log('logtext') noch log('logtext').
              Beides Mal gibt es eine Fehlermeldung "this.log is not a function" bzw. "log is not a function".
              Unter node.js gibt es log(' ') nicht. Daher ist das Verhalten für mich nachvollziehbar.

              Anders als console.log ist log wohl eine rein iobroker-Funktion, die es im require-scope nicht mehr gibt.
              Daher funktionier this1.log('text'), genauso wie this1.console.log('text); im zweiten Beispiel.
              Aber dazu muss dann eben wieder this übergeben werden.

              Leider ist das keine Lösung. Danke dennoch!

              T Nicht stören
              T Nicht stören
              ticaki
              schrieb am zuletzt editiert von
              #6

              @axel21
              Ich denke wie @OliverIO das du nicht this1.log() verwendet hast, falls doch.

              kannst du auch die log funktion übergeben und diese Verwenden.

              function function1 (a, this1, log){
                        // do some stuff
                        log('console.log innerhalb function1');
                        log('console.debug innerhalb function1');
                       return a+1;
                   }
               exports.function1 = function1;
              
              foo = require('../../../iobroker-data/modules/modneu.js');
              console.log(foo.function1(9, this, log));
              

              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

              Spenden

              OliverIOO 1 Antwort Letzte Antwort
              0
              • OliverIOO OliverIO

                @axel21

                Nach dem Beispiel von oben müsste es

                this1.log

                heißen.
                Log ist ein Befehl des JavaScript Adapters

                Hier der link zur typdefinition von Log
                https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/src/lib/javascript.d.ts#L1144

                Direkt darunter sieht man auch die Umleitung von console.
                Also ist console nun auch Bestandteil des globalen Objekts

                Wenn du vor console immer dein this1 davor schreibst funktioniert es.

                Also
                this1.console.log(.....

                Das Konzept nennt sich shadowing
                https://www.geeksforgeeks.org/javascript/variable-shadowing-in-javascript/

                In JavaScript ist ja nix geschützt. Auch interne Funktionen können überschrieben werden oder erweitert werden. Da gibt es schöne Beispiele wie bspw das String Objekt mit weiteren Funktionen erweitern , die exakt so angewendet werden können wie die bereits eingebauten.

                A Offline
                A Offline
                Axel21
                schrieb am zuletzt editiert von
                #7

                @oliverio
                Danke, da haben sich die Posts zeitlich überschnitten.

                Nochmal in Kürze:
                Es existiert ein Workaround, ich komme also zurecht.
                a) Aufrufende Funktion um ", this" ergänzen
                b) Aufgerufene Funktion um ", this1" ergänzen.
                c) this1.console.log oder this1.log verwenden.

                Das finde ich reichlich umständlich für ein console.log() zum debuggen.

                Außerdem von der Systematik her:
                console.log schreibt im require-scope "irgendwo" hin, nur wohin???
                Wäre es dann nicht sinnvoll, die neue iobroker console.log in diesen require scope im Adapter im wrapper mit einzubinden, so dass auch im require-scope in den iobroker geloggt wird?

                Dann erst wäre das Verhalten von iobroker-javascript identisch mit dem node.js bezüglich console.log.
                In node logt console.log sowohl im main-prg als auch im require-scope an die gleiche Ausgabe (weil statische globale Funktion) .

                Soweit zur Erläuterung hope that helps.
                Tks!

                T OliverIOO 2 Antworten Letzte Antwort
                0
                • A Axel21

                  @oliverio
                  Danke, da haben sich die Posts zeitlich überschnitten.

                  Nochmal in Kürze:
                  Es existiert ein Workaround, ich komme also zurecht.
                  a) Aufrufende Funktion um ", this" ergänzen
                  b) Aufgerufene Funktion um ", this1" ergänzen.
                  c) this1.console.log oder this1.log verwenden.

                  Das finde ich reichlich umständlich für ein console.log() zum debuggen.

                  Außerdem von der Systematik her:
                  console.log schreibt im require-scope "irgendwo" hin, nur wohin???
                  Wäre es dann nicht sinnvoll, die neue iobroker console.log in diesen require scope im Adapter im wrapper mit einzubinden, so dass auch im require-scope in den iobroker geloggt wird?

                  Dann erst wäre das Verhalten von iobroker-javascript identisch mit dem node.js bezüglich console.log.
                  In node logt console.log sowohl im main-prg als auch im require-scope an die gleiche Ausgabe (weil statische globale Funktion) .

                  Soweit zur Erläuterung hope that helps.
                  Tks!

                  T Nicht stören
                  T Nicht stören
                  ticaki
                  schrieb am zuletzt editiert von ticaki
                  #8

                  @axel21
                  Du kannst doch auch

                  function bla(this1) {
                    const console = this1.console;
                    //...
                    console.log('geht... yeah! :)');
                  }
                  

                  an den anfang schreiben :)

                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                  Spenden

                  A 1 Antwort Letzte Antwort
                  0
                  • T ticaki

                    @axel21
                    Ich denke wie @OliverIO das du nicht this1.log() verwendet hast, falls doch.

                    kannst du auch die log funktion übergeben und diese Verwenden.

                    function function1 (a, this1, log){
                              // do some stuff
                              log('console.log innerhalb function1');
                              log('console.debug innerhalb function1');
                             return a+1;
                         }
                     exports.function1 = function1;
                    
                    foo = require('../../../iobroker-data/modules/modneu.js');
                    console.log(foo.function1(9, this, log));
                    
                    OliverIOO Offline
                    OliverIOO Offline
                    OliverIO
                    schrieb am zuletzt editiert von
                    #9

                    @ticaki

                    Doch, genau this1.log meine ich.
                    Er übergibt an seine Funktion ja das globale Objekt des JavaScript Adapters.
                    Dort ist console und log entsprechend definiert.
                    Wenn er es dann in seinen eingebauten Funktionen verwenden will, muss er das entsprechend immer voranschreiten.

                    Jetzt etwas hacking, was ich auch noch nicht probiert habe.

                    global ist die variable die den aktuellen globalen context enthält.
                    Wenn er nun versucht am Anfang einer Funktion bspw mit

                    global = this1;

                    Diesen globalen context zu korrigieren, dann müsste
                    console.log wieder funktionieren.

                    Aber keine Ahnung ob global beschreibbar ist.

                    Meine Adapter und Widgets
                    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                    Links im Profil

                    1 Antwort Letzte Antwort
                    0
                    • A Axel21

                      @oliverio
                      Danke, da haben sich die Posts zeitlich überschnitten.

                      Nochmal in Kürze:
                      Es existiert ein Workaround, ich komme also zurecht.
                      a) Aufrufende Funktion um ", this" ergänzen
                      b) Aufgerufene Funktion um ", this1" ergänzen.
                      c) this1.console.log oder this1.log verwenden.

                      Das finde ich reichlich umständlich für ein console.log() zum debuggen.

                      Außerdem von der Systematik her:
                      console.log schreibt im require-scope "irgendwo" hin, nur wohin???
                      Wäre es dann nicht sinnvoll, die neue iobroker console.log in diesen require scope im Adapter im wrapper mit einzubinden, so dass auch im require-scope in den iobroker geloggt wird?

                      Dann erst wäre das Verhalten von iobroker-javascript identisch mit dem node.js bezüglich console.log.
                      In node logt console.log sowohl im main-prg als auch im require-scope an die gleiche Ausgabe (weil statische globale Funktion) .

                      Soweit zur Erläuterung hope that helps.
                      Tks!

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #10

                      @axel21

                      Ich vermute, das mit require ein normaler und nicht der vm context erzeugt wird. In diesem sind die ganzen funktionsdefinitionen und Umleitungen aber nicht mehr vorhanden. Daher muss man diese Korrekturen umsetzen.

                      Ideal wäre es nun, wenn der require Befehl für den JavaScript Adapter ebenfalls erweitert wird, so das er dort auch den JavaScript context mit bereitstellt.

                      Probiere mal das mit dem zuweisen zur variable global. Wenn das funktioniert,
                      Könnte ich dir einen workaround zeigen, bei dem man nach require nur einen Befehl ausführen muss um dann alles ganz normal zu verwenden.

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      A 1 Antwort Letzte Antwort
                      0
                      • T ticaki

                        @axel21
                        Du kannst doch auch

                        function bla(this1) {
                          const console = this1.console;
                          //...
                          console.log('geht... yeah! :)');
                        }
                        

                        an den anfang schreiben :)

                        A Offline
                        A Offline
                        Axel21
                        schrieb am zuletzt editiert von
                        #11

                        @ticaki
                        Ok Danke für diesen Tipp.
                        Der Post läuft gerade in eine andere Richtung als gedacht.

                        Ich habe drei Lösungen wie ich im require-scope ein log in die iobroker-console loggen kann.
                        Alle diese Lösungen erfordern das übergeben von "this" über die Funktion.

                        Für mich ist dieser Teil abgeschlossen.

                        Offen bleibt für mich und darum geht es mir:
                        Ist es so richtig im iobroker-javascript-Adapter implementiert?
                        Ist es so gewollt, dass die Ausgabe eines einfachen console.log im require-scope ohne this-trick - im nirgendwo landet?
                        Ist es gewollt, dass console.log im main und im require-scope an unterschiedliche Stellen (iobroker-console vs. nirgendwo) hinloggen.
                        Ist es gewollt, dass die iobroker-javascript-engine sich hier anders verhält als ein andere engine (hier node.js). Hier bekomme ich in beiden scopes das logging an die gleiche Stelle und kann es dort lesen.

                        Das ist meine Frage. Wenn die erfahrenen Leute hier sagen: "Ist so ok", dann -> closed.

                        1 Antwort Letzte Antwort
                        0
                        • OliverIOO OliverIO

                          @axel21

                          Ich vermute, das mit require ein normaler und nicht der vm context erzeugt wird. In diesem sind die ganzen funktionsdefinitionen und Umleitungen aber nicht mehr vorhanden. Daher muss man diese Korrekturen umsetzen.

                          Ideal wäre es nun, wenn der require Befehl für den JavaScript Adapter ebenfalls erweitert wird, so das er dort auch den JavaScript context mit bereitstellt.

                          Probiere mal das mit dem zuweisen zur variable global. Wenn das funktioniert,
                          Könnte ich dir einen workaround zeigen, bei dem man nach require nur einen Befehl ausführen muss um dann alles ganz normal zu verwenden.

                          A Offline
                          A Offline
                          Axel21
                          schrieb am zuletzt editiert von
                          #12

                          @oliverio
                          Zu Deinem Trick mit "global". Eben ausprobiert:

                          function function1 (a,this1) {
                              global=this1;
                              this1.console.log('innerhalb function1 this1.console.info'); // wird geloggt
                              console.log('innerhalb function1 mit global-Trick'); // wird leider ins nirgendwonicht geloggt
                          return a+1;
                          }
                          exports.function1 = function1;
                          
                          

                          mit Aufruf

                          foo = require('../../../iobroker-data/modules/modneu.js');
                          console.log(foo.function1(9, this));
                          

                          Leider nein: Aber einen solchen Hack hatte ich bei java vor jahren einmal. Mit einigen (internen und problematischen) Funktionen war es meiner Erinnerung nach möglich, den Kontext der aufrufenden Funktion zu ermitteln. War nicht lehrbuchgemäß, hatte aber funktioniert.

                          Danke dennoch, jetzt wissen wir, dass es so nicht geht.
                          Und wenn kein Erfahrener hier meint, dass man das an die javascript-Adapter-Leute weitermelden soll, dann ist es auch für mich gut.
                          Danke nochmals an alle, die bisher mitgedacht haben.

                          OliverIOO 1 Antwort Letzte Antwort
                          0
                          • A Axel21

                            @oliverio
                            Zu Deinem Trick mit "global". Eben ausprobiert:

                            function function1 (a,this1) {
                                global=this1;
                                this1.console.log('innerhalb function1 this1.console.info'); // wird geloggt
                                console.log('innerhalb function1 mit global-Trick'); // wird leider ins nirgendwonicht geloggt
                            return a+1;
                            }
                            exports.function1 = function1;
                            
                            

                            mit Aufruf

                            foo = require('../../../iobroker-data/modules/modneu.js');
                            console.log(foo.function1(9, this));
                            

                            Leider nein: Aber einen solchen Hack hatte ich bei java vor jahren einmal. Mit einigen (internen und problematischen) Funktionen war es meiner Erinnerung nach möglich, den Kontext der aufrufenden Funktion zu ermitteln. War nicht lehrbuchgemäß, hatte aber funktioniert.

                            Danke dennoch, jetzt wissen wir, dass es so nicht geht.
                            Und wenn kein Erfahrener hier meint, dass man das an die javascript-Adapter-Leute weitermelden soll, dann ist es auch für mich gut.
                            Danke nochmals an alle, die bisher mitgedacht haben.

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von
                            #13

                            @axel21

                            Gut, workaround ist da, ich werde bei Gelegenheit selber mal experimentieren.

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            1 Antwort Letzte Antwort
                            0
                            Antworten
                            • In einem neuen Thema antworten
                            Anmelden zum Antworten
                            • Älteste zuerst
                            • Neuste zuerst
                            • Meiste Stimmen


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            770

                            Online

                            32.5k

                            Benutzer

                            81.6k

                            Themen

                            1.3m

                            Beiträge
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2025
                            logo
                            • Anmelden

                            • Du hast noch kein Konto? Registrieren

                            • Anmelden oder registrieren, um zu suchen
                            • Erster Beitrag
                              Letzter Beitrag
                            0
                            • Home
                            • Aktuell
                            • Tags
                            • Ungelesen 0
                            • Kategorien
                            • Unreplied
                            • Beliebt
                            • GitHub
                            • Docu
                            • Hilfe