我不知道我是否在这里疯狂,但我做的事情非常基本,通常是微不足道的,但我现在已经坚持了一段时间。< / p>
我收到来自客户的消息,如下:
socket.on('request_username', function(messageFromClient) {
if(messageFromClient == undefined) {
Logger.logError("messageFromClient was undefined in socket_api.js");
return;
}
// Parse the message into Json, might not be needed.
// Logs: "{\"username\":\"test\"}"
console.log(messageFromClient);
try {
messageFromClient = JSON.parse(messageFromClient);
//Logs: {"username":"test"}
console.log(messageFromClient);
} catch(err) {
console.log("Error parsing json from request_username. Mesage is %s", err);
return;
}
// All undefined.
console.log(messageFromClient['"username"']);
console.log(messageFromClient["username"]);
console.log(messageFromClient['username']);
// msg == undefined incase the parse failed.
if(messageFromClient == undefined || messageFromClient.username == undefined) {
Logger.logError("messageFromClient.username was undefined in socket_api.js");
return;
}
var usernameRequested = messageFromClient.username;
现在我在日志中得到这个
"{\"username\":\"test\"}"
{"username":"test"}
Log Error: messageFromClient.username was undefined in socket_api.js
我不知道我做错了什么..
答案 0 :(得分:1)
使用socket.io,它会自动将Javascript数据序列化为JSON数据。你不必这样做,如果你试图,你可以搞砸了。
在socket.io中,您可以这样发送:
var data = {username: "test"};
socket.emit('request_username', data);
然后,在接收方,您将拥有:
socket.on('request_username', function(data) {
console.log(data.username); // will show "test"
});
来自/来自JSON的序列化由socket.io库自动完成(它是许多有用的功能之一)。
为了进一步调试您的具体情况,我们需要确切知道在您完成任何操作之前,当消息首次到达时,第一个console.log(messageFromClient)
显示的内容是什么?
您显示了一堆日志信息,但并不完全清楚哪个调试行与哪行代码相对应。如果第一个console.log显示:
"{\"username\":\"test\"}"
然后你的消息显然仍然是JSON,这可能是因为它是双JSON编码,这是发送端的错误。这应该在发送方修复,而不是试图双重解析它。
此外,在讨论此问题时请注意JSON是一种字符串格式。 Javascript对象是您可以在Javascript代码中直接访问属性的东西。看来你有时称它们为JSON,这让所有人感到困惑。您使用var jsonStr = JSON.stringify(obj)
将Javascript对象转换为JSON,并使用var obj = JSON.parse(someJSON)
将JSON转换为Javascript对象。
var obj = {username: test}; // Javascript object
var jsonStr = JSON.stringify(obj); // produces a JSON string
var obj2 = JSON.parse(jsonStr); // parses JSON string back to a Javascript object