【问题标题】:SocketIO cannot access JSON properties from ONSocketIO 无法从 ON 访问 JSON 属性
【发布时间】:2016-07-12 09:55:08
【问题描述】:

我不知道我是否会在这里发疯,但我正在做一些非常基本的事情,通常是微不足道的,但我已经坚持了一段时间了。

我收到来自客户的消息,如下所示:

            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

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

【问题讨论】:

  • 如果你使用 ES6,你应该使用 lambdas。我怀疑那些转义的斜线是你的问题。当您将messageFromClient['"username"'] 作为键时,您正在寻找messageFromClient.username
  • 我也试过传递{username:"test"},但它坏了。我仍然得到同样的错误
  • 所以您尝试了messageFromClient = { username : "test" };,但它仍然未定义?
  • 那行得通,所以解析有问题?
  • 发送代码在哪里,以便我们可以准确地看到您发送消息的方式/内容? socket.io 自动序列化到/从 JSON,所以你不需要自己做。事实上,如果你这样做,它可能会搞砸。

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


【解决方案1】:

使用 socket.io,它会自动将 Javascript 数据序列化到 JSON 或从 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

【讨论】:

  • 我得到undefined for console.log(messageFromClient.username); 我发送的json是{"username":"test"}
  • @iLoveUnicorns - 我在答案的末尾添加了更多内容。
  • 我仍然收到这个该死的错误,也许 Socket.io 测试器正在发送奇怪的字符?你知道我可以通过其他方式轻松测试套接字吗?
  • @iLoveUnicorns - 正如我所说,我不知道 socket.io 测试仪正在发送什么。也许它只是配置为发送字符串,而不是对象。
  • 但是如果它被配置为发送字符串,那么为什么 JSON.parse 会失败?
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2020-11-28
  • 2014-01-21
相关资源
最近更新 更多