【问题标题】:JSON not serialising properly... I think?JSON没有正确序列化......我想?
【发布时间】:2011-06-22 07:58:20
【问题描述】:

我有一个使用 socket.io 的 Node.js 项目。在其中,我尝试像这样将一个对象从客户端发送到服务器:

socket.send(JSON.stringify({'type':'msg','message':'test'}));

当它到达服务器时,我在它上面调用JSON.parse,并检查是否object.type == 'msg'。当我运行代码并调用console.log(object.type) 时,它返回"msg",但object.type == 'msg' 返回false。这是怎么回事?

编辑:

失败的代码的相关部分是:

client.on('message', function(message, client){
    var envelope = JSON.parse(message);
    console.log(envelope.type);
    if(envelope.type == "msg") { console.log("yay!"); }
}

只要有消息进来,就会打印msg,但不会打印yay!

【问题讨论】:

  • 你能告诉我们一些你的服务器代码吗?现在我想不出任何失败的原因。
  • 你说“...它返回msg,...”,不应该返回一个带有msg的对象吗?
  • 尝试注入console.log(message);作为函数的第一行。另外,检查typeof envelope.type,如果它没有读取字符串,那么这就解释了比较失败的原因。
  • @Martin 他使用的是==,所以这里的类型无关紧要,我怀疑Node 吞下了第二个log() 调用,我过去遇到过这样的问题。
  • @Ivo 问题是第二个console.log调用之后的代码也没有被调用,其他双日志之前都工作过。

标签: javascript json node.js socket.io


【解决方案1】:

您的消息必须采用“{"type":"msg"}' 格式。

【讨论】:

    【解决方案2】:

    您是否已经尝试在 JSON 消息中使用非文字作为键?我正在构建一个小型聊天服务器来探索 socket.io,使用 JSON 消息。这是我的相关代码:

    客户端:

    var jsonMsg = {
          action: 'SEND',
          body: msg,
          name: name.val()
        };
    socket.send(JSON.stringify(jsonMsg));
    

    请注意,msg 和 name.val() 都是字符串值,从相应的输入字段中获取。

    服务器端:

    client.on('message', function(m, c) {
      // parse message
      var msg = json.parse(m);
    
      switch (msg.action) {
        case 'SEND':
          // send message to channel
          var broadCast = {
            posted: date.toReadableDate(new Date(), 'timestamp'),
            message: msg.body,
            name: msg.name
          };
          socket.broadcast(json.stringify(broadCast));
          break;
      }
    });
    

    注意:toReadableDate 是自定义原型方法。

    消息在服务器端和客户端作为广播正确接收。

    【讨论】:

    • 这不会有什么不同,密钥是由客户端解析的,所以它们是否(正确)编码应该没有什么不同。
    • 您使用的是哪个 json 序列化库?我的示例使用json2.js,也许这就是警告。
    • V8 两侧。使用单独的 JSON 库效率低下。
    • 你试过两端都使用json2.js吗?我看不到您的问题的任何其他来源(除了一些空字符滑入,但这真的不应该发生)。
    【解决方案3】:

    也许这是一个节点错误?我刚刚在 0.5.0-pre 中尝试过,它在有限的环境中运行良好。

    > message = JSON.stringify({'type':'msg','message':'test'})
    '{"type":"msg","message":"test"}'
    >     var envelope = JSON.parse(message);
    >     console.log(envelope.type);
    msg
    >     if(envelope.type == "msg") { console.log("yay!"); }
    yay!
    

    其他选项可能是编码问题(在终端上看起来像“msg”,但严格来说不是字符串中的那些字符吗?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-21
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 2019-04-11
      相关资源
      最近更新 更多