NodeJs: TypeError, Cannot read property 'Player' of undefined
Ivory
- javascript
0 1UnitedPower0 Ivory0 1UnitedPower0 Ivory
0 Ivory
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 <button id="Kaufen"+a+"" value=""+result[a].ID+"">Kaufen</button>";
}
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 <button id="Kaufen"+a+"" value=""+result[a].ID+"">Kaufen</button>";
}
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 <button id="Kaufen"+a+"" value=""+result[a].ID+"">Kaufen</button>";
}
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();
}
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?
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. Undundefined
hat keine Eingeschaften, deswegen wird der Fehler geworfen, sobald du versuchst eine Eigenschaft (hier .Player) vonundefined
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
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. Undundefined
hat keine Eingeschaften, deswegen wird der Fehler geworfen, sobald du versuchst eine Eigenschaft (hier .Player) vonundefined
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;
> undefined
$ (undefined).Player
> 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?
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
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.
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