comportement Confondre objet JavaScript
-
27-10-2019 - |
Question
J'utilise Socket.IO avec Node.js.
J'ai un socket
objet qui ressemble à ceci:
SocketNamespace
$events: Object
...
socket: Socket
Alors si je regarde Socket
(à savoir socket.socket
)
Socket
$events: Object
...
sessionid: "1549988601982716407"
Encore une fois, fonctionne très bien.
Mais si je veux juste revenir sessionid
, donc j'utilise socket.socket.sessionid
je reçois ...
undefined
Si je fais un typeof
pour socket.socket
je reçois object
, mais pour socket.socket.sessionid
, je viens d'obtenir undefined
.
Modifier voici mon code:
Navigateur:
$(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) {
});
Modifier 2: Plus de données:
Au lieu de l'un journal, je l'ai remplacer par cela;
console.log(typeof(socket));
console.log(typeof(socket.socket));
console.log(typeof(socket.socket.sessionid));
Renvoie:
object
object
undefined
attendu:
object
object
string
Edit 3: * Capture d'écran
Modifier 4
, curieusement, des œuvres.
var x;
for (x in socket.socket)
{
if (x == 'sessionid') {
console.log(socket.socket[x]);
}
}
La solution 2
Je ne peux pas le croire.
socket.socket['sessionid']
Cela a fonctionné. Merci à tous.
Autres conseils
socket.socket.sessionid
est en effet valide et contient l'identifiant de session une fois qu'il est défini. Le problème est qu'il ne soit pas réglé au moment de l'impression à la console, puisque la prise n'a pas encore fait une connexion (et n'a donc pas un identifiant de session).
Modifier les lignes
var socket = io.connect('http://localhost:8080');
console.log(socket.socket.sessionid);
à
var socket = io.connect('http://localhost:8080');
socket.on('connect', function () {
console.log(socket.socket.sessionid);
});
et tout devrait être d'or.
Je vais essayer d'expliquer pourquoi l'erreur est survenue en premier lieu.
Le TC, était à la recherche sur la console de dev Chrome et il montrait des données. Mais
console.log(typeof(socket));
et
console.log(typeof(socket.socket.sessionid));
ne pas produire une sortie égale.
Si vous regardez la console Chrome, vous verrez un petit symbole « i » près de l'objet.
Cela signifie que lorsque vous essayez d'accéder sessionid il n'a pas réellement. Essayez par exemple la propriété ouverte. Vous verrez qu'il montre quelque chose de différent de la sortie de l'objet.
Mais quand vous cliquez sur dans une console, il produit à la volée.
Si vous avez besoin d'un code de travail, il ressemble à ceci:
// 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
Maintenant, cela produira un sessionid valide sur un côté client.
Comme vous le voyez, dans votre exemple, vous essayez simplement d'accéder à une propriété non encore existante. Quelques millisecondes trop vite;)
J'espère que c'est clair maintenant.