Comment envoyer un objet JavaScript avec Socket.io
Du serveur au client? J'utilise Socket.io comme WebSocket (envoi avec .send()
et écoute avec message
événement). Lorsque j'essaie de faire quelque chose comme côté serveur:
var myObject = {
message: 'Hello World!'
}
socket.send(myObject);
côté client, je ne reçois que cette chaîne: [object Object]
Vous devez en fait émettre un événement à la place:
socket.emit('yourEvent', myObject);
Si vous utilisez .send()
, vous envoyez simplement la représentation sous forme de chaîne de votre objet, là où le problème se produit. Notez que vous pouvez utiliser .send()
, mais vous devez d'abord coder JSON l'objet et le décoder à la réception.
Sauf si vous avez une raison spécifique, il est préférable d'utiliser la méthode standard Socket.IO .emit()
, car elle fait tout cela pour vous. C'est pour ça qu'il est là.
Je viens de rencontrer ce problème en utilisant un exemple plus ancien. Voici la réponse que j'ai trouvée: Migration de 0,6 à 0,7 + , que je reproduis ci-dessous.
Dans la v0.6, socket.send
convertirait automatiquement un objet comme {a: 'b'}
à JSON. Vous enverriez des données à un client avec:
socket.send({a: 'b'});
Bien que ce soit cool, cela pose un problème fondamental. JSON code non seulement les objets, mais aussi les chaînes, les nombres, etc.! Ainsi, l'API est plus claire si vous déclarez explicitement que vous souhaitez passer JSON (car il y a une pénalité de performance associée au codage/décodage JSON).
Dans la version 0.7, utilisez l'indicateur json
:
socket.json.send({a: 'b'});
Maintenant, vous pouvez également émettre et recevoir des événements personnalisés entre le navigateur et le serveur:
socket.emit('my_event', {a: 'b'});
Les arguments des événements sont automatiquement encodés en JSON pour vous.
socket.send()
ne comprend pas l'objet mais il apprécie avec JSON. Vous pouvez utiliser de cette façon:
socket.send(JSON.stringify(myObject));
Et utilisez JSON.parse(json)
pour analyser JSON en Object.
Essayez de l'utiliser sur votre côté serveur
socket.json.send({ your : 'data' });
et la méthode JSON.parse()
de votre côté client.