首页 > 解决方案 > WebSocket.ws.onmessage 中未捕获的 TypeError

问题描述

我是网络套接字的新手,我试图通过尝试下面的代码来弄湿我的脚。

var id=0; 
var symbol=""; 
var interval=""; 
var open_time=0; 
var open=0; 
var high=0; 
var low=0; 
var close=0; 

var ws = new WebSocket('wss://stream.bybit.com/realtime');

ws.onopen = function(){
    //console.log("Socket has been opened!");
    ws.send('{"op":"subscribe","args":["kline.BTCUSD.1m"]}');
}

ws.onmessage = function(msg){
    //console.log(msg.data);        

    var obj = JSON.parse(msg.data);
    //console.log(obj.data);

    id = obj.data.id;
    symbol = obj.data.symbol;
    interval = obj.data.interval;
    open_time = new Date(obj.data.open_time * 1000);
    open = obj.data.open;
    high = obj.data.high;
    low = obj.data.low;
    close = obj.data.close;

}

虽然上面的代码工作得很好,但我仍然无法找出下面控制台日志中的错误:

main.js:28 Uncaught TypeError: Cannot read property 'id' of undefined
    at WebSocket.ws.onmessage (main.js:28)

我希望有人能给我一个想法,为什么在第一次迭代时使用该onmessage函数cannot read the property "id" of undefined,但在随后的循环中读取它没有问题。

标签: javascriptwebsocket

解决方案


您在此声明中收到该错误id = obj.data.id;

在这里,您正在尝试访问id. data但是,这data就是undefined该错误的原因。

您正在data从获取msg,它是从套接字连接发送的。确保您msg第一次发送适当的值。

这是该错误的解释。如果您可以在向此函数发送数据的位置发布代码,我们可以了解如何修复该错误。

编辑:

看起来您正在从其他第三方服务器接收数据。如果您可以运行以下代码,您可以看到您收到的第一条消息。

第一条消息:

{"success":true,"ret_msg":"","conn_id":"b75dcae2-48e6-4283-8922-3799a199d8c8",
"request":{"op":"subscribe","args":["kline.BTCUSD.1m"]}}

在此处输入图像描述

如您所见,第一条消息没有data属性。当您尝试访问它时,您会收到该错误。

data属性从第二条消息开始就存在,因此您不会在后续消息中收到任何错误。

第二条消息:

{ "topic":"kline.BTCUSD.1m",
   "data":{
      "id":0,"symbol":"BTCUSD", "open_time":1567828500,"open":10349,
      "high":10349.5,"low":10349,"close":10349.5,"volume":420020,
      "turnover":40.58444293000001,"interval":"1m"
    }
}

演示:

var ws = new WebSocket('wss://stream.bybit.com/realtime');

ws.onopen = function() {
  //console.log("Socket has been opened!");
  ws.send('{"op":"subscribe","args":["kline.BTCUSD.1m"]}');
}

messages = [];

ws.onmessage = function(msg) {

  messages.push(msg.data);
  console.log(messages[0]);
}

您可以检查该data属性是否不存在undefinednull在访问之前检查。

ws.onmessage = function(msg) {

  if(msg && msg.data) {

    var obj = JSON.parse(msg.data);

    if(obj && obj.data) {           
      id = obj.data.id;
      symbol = obj.data.symbol;
      interval = obj.data.interval;
      open_time = new Date(obj.data.open_time * 1000);
      open = obj.data.open;
      high = obj.data.high;
      low = obj.data.low;
      close = obj.data.close;
    }
  }
}

推荐阅读