Ivory: NodeJs: TypeError, Cannot read property 'Player' of undefined

Hallo zusammen

Ich bin hier auf ein komischer Problem gestossen und wollte einmal in die Runde fragen ob jemmand möglicherweise die Lösung kennt ;)

Funktionsbeschrieb:

Diese funktion wird jede Sekunde ausgelöst!
Diese Funktion generiert Buttons und sendet diese an alle Benutzer.
Um die Performence du verbessern sendet es diese nur Sobald eine Veränderung in der Datenbank auftritt.

Jetzt kauft man als Keufer im Auktionshaus einen Artikel funktioniert das alles auch wunderbar.
Nur nach unbestimmter Zeit taucht plötzlich dieser Error auf:

Konsolen Debug ausgaben:
spast Was ist der Fehler?
Funkey Was ist der Fehler?
Funkey Was ist der Fehler?
Funkey Was ist der Fehler?
Funkey Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?
s Was ist der Fehler?

TypeError: Cannot read property 'Player' of undefined
    at Query._callback (D:\NodeJs\neu\server.js:2037:34)
    at Query.Sequence.end (D:\NodeJs\node_modules\mysql\lib\protocol\sequences\S
equence.js:78:24)
    at Query._handleFinalResultPacket (D:\NodeJs\node_modules\mysql\lib\protocol
\sequences\Query.js:143:8)
    at Query.EofPacket (D:\NodeJs\node_modules\mysql\lib\protocol\sequences\Quer
y.js:127:8)
    at Protocol._parsePacket (D:\NodeJs\node_modules\mysql\lib\protocol\Protocol
.js:213:24)
    at Parser.write (D:\NodeJs\node_modules\mysql\lib\protocol\Parser.js:62:12)
    at Protocol.write (D:\NodeJs\node_modules\mysql\lib\protocol\Protocol.js:37:
16)
    at Socket.<anonymous> (D:\NodeJs\node_modules\mysql\lib\Connection.js:75:28)

at Socket.EventEmitter.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:745:14)
    at Socket.EventEmitter.emit (events.js:92:17)

Dieser besagt das result[a].Player undefiniert sei. Bzw wird der Player als undefiniert angesehen obwohl dieser in der DatenBank vorhanden ist. Komischerweise tritt dieser Fehler erst nach einer unbestimmten Zeit ein.

Ich habe mir zusätzlich überlegt, dass wenn Player Undefiniert ist einfach nichts getan werden soll. Sobald aber der Player undefiniert ist crasht der Server...

Jetzt hoffe ich auf gute Ideen!

Grüsse Ivory

PS: delete vorhandeneSpieler; / vorhandeneSpieler = []; Same shit i now ;)

  
function updateWarenLager(){  
var connection = mysql.createConnection({  
    host: '**********************',  
    user: '**********************',  
    password: '******************',  
    database: '******************'  
});  
delete vorhandeneSpieler;  
vorhandeneSpieler = [];  
var query = connection.query(  
       // 'INSERT INTO PlayerAndRessource (Player, PlayerRessourceH, PlayerRessourceS, PlayerRessourceM) VALUES ("", "", "", "")'  
    "SELECT Player FROM AuktionsLager", function(err, result, fields){  
        if(err) throw err;  
        //result[0].Player  
        //console.log(result.length);  
        vorhandeneSpieler = result.length;  
       // updateNicknames();  
       });  
//console.log("Hierhin kommt der code 2");  
var query = connection.query(  
// 'INSERT INTO PlayerAndRessource (Player, PlayerRessourceH, PlayerRessourceS, PlayerRessourceM) VALUES ("", "", "", "")'  
    "SELECT ID, Player, HolzMenge, HolzWunschMenge, SteinMenge, SteinWunschMenge, MetallMenge, MetallWunschMenge FROM AuktionsLager", function(err, result, fields){  
        if(err){  
            console.log("Ein Fehler ist aufgetreten bei der generierung der Buttons!");  
        }else{  
            delete Player;  
Player = [];  
HolzMenge = [];  
HolzWunschMenge = [];  
SteinMenge = [];  
SteinWunschMenge = [];  
MetallMenge = [];  
MetallWunschMenge = [];  
Struktur = [];  
        for(a=0; a < vorhandeneSpieler; a++){  
            console.log(result[a].Player+" Was ist der Fehler?");  
            if(result[a].Player == "undefined"){  
                console.log("Hier liegt der fehler aber wiso?^^");  
                //es kommt vo das result[a] undefiniert ist dan gibs ein fehler aber wiso?  
                return;  
            }  
            //console.log(result[a].Player);  
            //Falls dieser Fehler eintrifft tuh nichts -  
  
        Player[a] = result[a].Player+" ";  
        //console.log(Player[a]);  
        if(result[a].HolzMenge === null){  
                HolzMenge[a] = "";  
            }else{  
                HolzMenge[a] = "bietet: "+result[a].HolzMenge+" Holz ";  
            }  
        if(result[a].HolzWunschMenge === null){  
                HolzWunschMenge[a] = "";  
            }else{  
                HolzWunschMenge[a] = "Sucht: "+result[a].HolzWunschMenge+" Holz &lt;button id=&quot;Kaufen"+a+"&quot; value=&quot;"+result[a].ID+"&quot;&gt;Kaufen&lt;/button&gt;";  
            }  
        if(result[a].SteinMenge === null){  
                SteinMenge[a] = "";  
            }else{  
                SteinMenge[a] = "bietet: "+result[a].SteinMenge+" Stein ";  
            }  
        if(result[a].SteinWunschMenge === null){  
                SteinWunschMenge[a] = "";  
            }else{  
                SteinWunschMenge[a] = "Sucht: "+result[a].SteinWunschMenge+" Stein &lt;button id=&quot;Kaufen"+a+"&quot; value=&quot;"+result[a].ID+"&quot;&gt;Kaufen&lt;/button&gt;";  
            }  
        if(result[a].MetallMenge === null){  
                MetallMenge[a] = "";  
            }else{  
                MetallMenge[a] = "bietet: "+result[a].MetallMenge+" Metall ";  
            }  
        if(result[a].MetallWunschMenge === null){  
                MetallWunschMenge[a] = "";  
            }else{  
                MetallWunschMenge[a] = "Sucht: "+result[a].MetallWunschMenge+" Metall &lt;button id=&quot;Kaufen"+a+"&quot; value=&quot;"+result[a].ID+"&quot;&gt;Kaufen&lt;/button&gt;";  
            }  
            Struktur[a] = Player[a]+HolzMenge[a]+HolzWunschMenge[a]+SteinMenge[a]+SteinWunschMenge[a]+MetallMenge[a]+MetallWunschMenge[a]+"</br>";  
    }  
        console.log(vorhandeneSpieler);  
        if(Speicher === vorhandeneSpieler && socket.PlayerLoader >= 1){  
            //console.log("Es gab kein Update, sende nichts!");  
        }else{  
            console.log('Update Aktionshaus!');  
        socket.PlayerLoader++;  
        Speicher = vorhandeneSpieler;  
        io.sockets.emit('AuktionsLagerUpdater', Struktur, vorhandeneSpieler);  
        }  
    }  
    });  
    connection.end();  
}  

  1. Meine Herren!

    TypeError: Cannot read property 'Player' of undefined

    Dieser besagt das result[a].Player undefiniert sei.

    Nein, der Fehler sagt, dass result[a] undefined ist. Und undefined hat keine Eingeschaften, deswegen wird der Fehler geworfen, sobald du versuchst eine Eigenschaft (hier .Player) von undefined zu lesen.

    delete vorhandeneSpieler;

      
    Was hast du hier vor? Mit delete kannst du Eigenschaften von Objekten löschen, aber keine Variablen.  
      
    
    > ~~~javascript
      
    
    > vorhandeneSpieler = [];  
    > // .... viel später im Text:  
    > for(a=0; a < vorhandeneSpieler; a++){  
    > 
    
    

    Sollte da vielleicht vorhandeneSpieler.length in der for-Schleife stehen?

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Meine Herren!

      TypeError: Cannot read property 'Player' of undefined

      Dieser besagt das result[a].Player undefiniert sei.

      Nein, der Fehler sagt, dass result[a] undefined ist. Und undefined hat keine Eingeschaften, deswegen wird der Fehler geworfen, sobald du versuchst eine Eigenschaft (hier .Player) von undefined zu lesen.

      Jop, habe ich das nicht so geschildert?^^ Dan endschuldige ich bin leider nicht der Pro beim erklären^^

      delete vorhandeneSpieler;

      
      >   
      > Was hast du hier vor? Mit delete kannst du Eigenschaften von Objekten löschen, aber keine Variablen.  
        
      Dies war nur ein Test der delete befehl kann entfernt werden.  
        
      
      > > ~~~javascript
        
      
      > > vorhandeneSpieler = [];  
      > > // .... viel später im Text:  
      > > for(a=0; a < vorhandeneSpieler; a++){  
      > > 
      
      

      Sollte da vielleicht vorhandeneSpieler.length in der for-Schleife stehen?

      Jop genau, ich konnte den Fehler schon beheben, das prob war das iwie die 2 querys Probleme gemacht haben.

      var query = connection.query(  
      // 'INSERT INTO PlayerAndRessource (Player, PlayerRessourceH, PlayerRessourceS, PlayerRessourceM) VALUES ("", "", "", "")'  
          "SELECT ID, Player, HolzMenge, HolzWunschMenge, SteinMenge, SteinWunschMenge, MetallMenge, MetallWunschMenge FROM AuktionsLager", function(err, result, fields){  
              if(err){  
                  console.log("Ein Fehler ist aufgetreten bei der generierung der Buttons!");  
              }else{  
                  vorhandeneSpieler = [];  
                  vorhandeneSpieler = result.length;  
      
      

      Wiso das jetzt Problemlos funktioniert ist mir ein Rätsel da ja eig nichts anderes gemacht wird als vorher...

      Danke trozdem für deinen Beitrag!

      Gruss Ivory

      1. Meine Herren!

        TypeError: Cannot read property 'Player' of undefined

        Dieser besagt das result[a].Player undefiniert sei.

        Nein, der Fehler sagt, dass result[a] undefined ist. Und undefined hat keine Eingeschaften, deswegen wird der Fehler geworfen, sobald du versuchst eine Eigenschaft (hier .Player) von undefined zu lesen.

        Jop, habe ich das nicht so geschildert?^^ Dan endschuldige ich bin leider nicht der Pro beim erklären^^

        Es macht einen Unterschied, ob der Ausdruck
        result[a].Player
        undefined ist. Oder ob bereits
        result[a]
        undefined ist.

        Das können wir uns mit folgenden Beispielen vor Augen führen (ich benutze für das Beispiel die üblichen Konsolen-Schreibweise, du kannst sie selber nachvollziehen indem du die JavaScript-Konsole in deinem Browser öffnest (in Chrome Strg+Umschalt+j)):

        $ ({}).Player;
        &gt; undefined

        $ (undefined).Player
        &gt; TypeError: Cannot read property 'Player' of undefined

        Du hast die Fehlermeldung nicht genau genug gelesen, deswegen findet sich in deinem Code auch diese Abfrage:
        if(result[a].Player == "undefined")

        An dieser Stelle hättest du eigentlich prüfen sollen:
        if(result[a] == "undefined")

        Ist der Unterschied jetzt klar geworden?

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Hio

          Du hast die Fehlermeldung nicht genau genug gelesen, deswegen findet sich in deinem Code auch diese Abfrage:
          if(result[a].Player == "undefined")

          An dieser Stelle hättest du eigentlich prüfen sollen:
          if(result[a] == "undefined")

          Dies erscheint mir auf den ersten Blick nicht sinvoll, da wenn ich result[a] prüfen würde eh immer undefined dabei rauskommt, aussert ich prüfe es nach dem Setzen der Eigeschaft (Was ja auch sin machen würde). An diesem Punkt ist es aber schon zu spät da der Server schon crashen würde. ;)

          Die Fehlermeldung besagt ja: Die Eigenschaft von Player ist undefiniert.
          Oder habe ich das falsch verstanden?

          Atm wurde diese Prüfung eh entfernt. Lediglich habe ich eine Alternative gesucht um den Fehler zu umgehen. Den ich ja zum Glück entfernen konnte :)

          Vielen Dank für deinen Beitrag :)

          Grüsse Ivory

          1. Meine Herren!

            Die Fehlermeldung besagt ja: Die Eigenschaft von Player ist undefiniert.
            Oder habe ich das falsch verstanden?

            Ja das hast du falsch verstanden. Player _ist_ die Eigenschaft, die nicht von undefined gelesen werden kann. "Cannor read property 'Player' of undefined" bedeutet wörtlich übersetzt: "Kann die Eigenschaft namens 'Player' von undefined nicht lesen"

            Um eine Eigenschaft von "etwas" lesen zu können, muss das "etwas" erstmal genauer bekannt sein. "etwas" muss genauer gesagt ein Objekt sein. undefined ist aber kein Objekt, also kann es keine Eigenschaften haben. Du kannst ihm keine Eigenschaften zuweisen:

            $ undefined.eigenschaftsName = 'foo';

            Cannot set property 'eigenschaftsName' of undefined

            Und du kannst auch keine Eigenschaften von undefined lesen:
            $ var foo = undefined.eigenschaftsName

            TypeError: Cannot read property 'eigenschaftsName' of undefined

            Und jetzt tausche in den beiden Beispielen mal "undefined" mit "result[a]" und "eigenschaftsName" mit "Player" aus und versuche nochmal die Fehlermeldung zu verstehen.

            --
            “All right, then, I'll go to hell.” – Huck Finn
    2. Sollte da vielleicht vorhandeneSpieler.length in der for-Schleife stehen?

      Update: Ah natürlich nicht in der for Schleife aber direkt im selben Query. Danach gibt es keine Probleme mehr.

      Gruss Ivory