Verwirrung des JavaScript -Objektverhaltens
-
27-10-2019 - |
Frage
Ich verwende Socket.io mit node.js.
Ich habe ein Objekt socket
was so aussieht:
SocketNamespace
$events: Object
...
socket: Socket
Also, wenn ich mir anschaue Socket
(dh socket.socket
)
Socket
$events: Object
...
sessionid: "1549988601982716407"
Wieder funktioniert gut.
Aber wenn ich nur zurückkehren möchte sessionid
, also benutze ich socket.socket.sessionid
Ich bekomme...
undefined
Wenn ich a mache typeof
zum socket.socket
Ich bekomme object
, aber für socket.socket.sessionid
, Ich bekomme einfach undefined
.
Bearbeiten: Hier ist mein Code:
Browser:
$(function() {
$.getScript('http://localhost:8080/socket.io/socket.io.js', function() {
var socket = io.connect('http://localhost:8080');
console.log(socket.socket.sessionid);
});
});
App:
var io = require('socket.io').listen(8080);
io.sockets.on('connection', function (socket) {
});
Bearbeiten 2: Weitere Daten:
Anstelle des einen Protokolls habe ich dies ersetzt;
console.log(typeof(socket));
console.log(typeof(socket.socket));
console.log(typeof(socket.socket.sessionid));
Kehrt zurück:
object
object
undefined
Erwartet:
object
object
string
Bearbeiten 3:* Bildschirmfoto
Bearbeiten 4
Dies funktioniert seltsamerweise.
var x;
for (x in socket.socket)
{
if (x == 'sessionid') {
console.log(socket.socket[x]);
}
}
Lösung 2
Ich kann das nicht glauben.
socket.socket['sessionid']
Das hat funktioniert. Vielen Dank an alle.
Andere Tipps
socket.socket.sessionid
ist in der Tat gültig und enthält die Sitzungs -ID, sobald sie festgelegt ist. Das Problem ist, dass es in dem Moment, in dem Sie es in die Konsole drucken, nicht festgelegt ist, da der Socket noch keine Verbindung hergestellt hat (und daher keine Sitzungs -ID hat).
Ändern Sie die Linien
var socket = io.connect('http://localhost:8080');
console.log(socket.socket.sessionid);
zu
var socket = io.connect('http://localhost:8080');
socket.on('connect', function () {
console.log(socket.socket.sessionid);
});
Und alles sollte golden sein.
Ich werde versuchen zu erklären, warum der Fehler überhaupt aufgetreten ist.
Der TC schaute sich die Chrome Dev -Konsole an und zeigte einige Daten. Aber
console.log(typeof(socket));
und
console.log(typeof(socket.socket.sessionid));
unterlassen Sie erzeugen gleiche Ausgabe.
Wenn Sie sich die Chromkonsole ansehen, sehen Sie ein kleines "I" -Symbol in der Nähe des Objekts.
Dies bedeutet, dass wenn Sie versuchen, auf Sessionid zuzugreifen, es nicht hat. Versuchen Sie es mit offenem Eigentum. Sie werden sehen, dass es etwas anderes als die Objektausgabe zeigt.
Aber wenn du klicken In einer Konsole produziert es es im Fliegen.
Wenn Sie einen Arbeitscode benötigen, sieht dies so aus:
// SERVER. Place it where you first _receive_ a connection from a client.
socket.emit('connected');
// This will emit connected message.
//It is a signal to your client, that there is an established CLIENT<->SERVER connetion
// CLIENT
socket.on('connected', function (){
console.log(socket.socket.sessionid);} // This produces correct sessionid
Dies erzeugt nun eine gültige Sitzung auf einer Client -Seite.
Wie Sie sehen, versuchen Sie in Ihrem Beispiel einfach, auf eine nicht vorhandene Eigenschaft zuzugreifen. Ein paar Millisekunden zu schnell;)
Ich hoffe das ist jetzt klar.