SocketIO无法从ON访问JSON属性

时间:2016-03-24 17:31:29

标签: json node.js socket.io ecmascript-6

我不知道我是否在这里疯狂,但我做的事情非常基本,通常是微不足道的,但我现在已经坚持了一段时间。< / 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

我不知道我做错了什么..

1 个答案:

答案 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