Bug lors de l'envoi de tableau dans node.js et socket.io
-
28-10-2019 - |
Question
J'utilise socket.io version 0.8.4
J'ai résumé mon problème comme suit.J'ai des données qui ressemblent à ceci:
data.prop1 = [];
data.prop1.push("man");
data.prop2 = [];
data.prop2["hey"] = "man";
J'envoie les données du serveur au client de cette façon:
socket.emit("data", data);
Du côté client, je reçois les données de cette manière:
socket.on("data", function(data){ console.log(data); });
La chose étrange est:
data.prop1 = [];
data.prop1.push("man"); // This data exists in the client side data object
data.prop2 = [];
data.prop2["hey"] = "man"; // This data does not exist.
data.prop2 n'est qu'un tableau vide côté client.
Y a-t-il un bogue connu dans la sérialisation des tableaux json sur le formulaire dans prop2?
Merci d'avance
MODIFIER:
Problème résolu en utilisant cette solution de contournement:
data.prop1 = [];
data.prop1.push("man");
data.prop2 = {}; // <= Object instead of array
data.prop2["hey"] = "man";
La solution
ECMA-262 à propos du JSON.stringify
:
La représentation des tableaux inclut uniquement les éléments entre zéro et
array.length – 1
inclus.Les propriétés nommées sont exclues de la stringification.
Les tableaux sont censés avoir des noms de propriétés numériques.Ainsi, lorsque le data.prop2
est transformé en JSON (dans lequel socket.io envoie les données, j'imagine), il n'obtient pas la propriété 'hey'
.Si vous souhaitez utiliser des noms de propriétés non numériques, vous devez utiliser des objets au lieu de tableaux:
data.prop1 = [];
data.prop1.push("man");
data.prop2 = {}; // Notice we're creating an object, not an array.
data.prop2["hey"] = "man"; // Alternatively: data.prop2.hey = "man"
Autres conseils
Malheureusement, Javascript ne fonctionne pas vraiment comme ça.
Consultez cet article , environ la moitiédescente.Cela explique le problème où vous essayez de définir data.prop2 ["hey"]="man";