javascript - 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
,但在随后的循环中读取它没有问题。
解决方案
您在此声明中收到该错误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
属性是否不存在undefined
或null
在访问之前检查。
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;
}
}
}
推荐阅读
- scala - 如何通过谓词在Scala中将集合拆分为多个子集(具有内部排序)?
- django - Django:将返回 QuerySet 的属性与 SubQuery 注释相关联
- python - 是否有相当于 to_markdown 来读取数据?
- python - 如何编写一个从同一文件夹顺序运行 5 个其他脚本的脚本?
- r - 在 R 中使用 paste() 编写扩展的文本
- git - 将新的 github 存储库合并到远程
- python-3.x - Dask 并行处理比使用 pathos 多处理慢得多
- android - 为什么在测试我的第一个颤振 hello world 应用程序时 graddle 更新失败
- string - 从名称中调用一个小部件类作为颤振中的字符串
- java - 尝试使用 spring boot 2 启动 gemfire 脉冲时出现 jackson cast 异常