使用WebSocket时无法获取event.data对象的属性值该如何解决?
问题根因
你遇到的问题核心是 WebSocket返回的e.data是JSON字符串类型,而非可直接读取属性的JavaScript对象,直接对字符串执行属性访问自然会得到undefined。
解决方案
修正后的完整可运行代码如下:
let socket = new WebSocket('wss://stream.binance.com:9443/ws/ethusdt@kline_1m') let o = { "method": "SUBSCRIBE", "params": [ "ethusdt@kline_1m" ], "id": 1 } // 等待WebSocket连接成功后再发送订阅请求,避免连接未就绪抛出异常 socket.addEventListener('open', () => { socket.send(JSON.stringify(o)) }) socket.addEventListener('message', (e)=>{ // 1. 将JSON字符串反序列化为JavaScript对象 const resData = JSON.parse(e.data) // 2. 过滤订阅成功响应等非K线事件消息,避免读取不到属性报错 if(resData.e === 'kline') { const candle = resData.k console.log('完整K线结构:', candle) console.log('开盘价:', candle.o, '收盘价:', candle.c, '最高价:', candle.h, '最低价:', candle.l) } }) // 可选:添加错误监听,方便排查连接/传输问题 socket.addEventListener('error', (err) => { console.error('WebSocket异常:', err) })
额外注意事项
- 生产环境建议给
JSON.parse包裹try...catch做容错,避免网络传输异常导致JSON字符串不完整时程序崩溃,容错写法示例:
socket.addEventListener('message', (e)=>{ try { const resData = JSON.parse(e.data) if(resData.e === 'kline') { console.log(resData.k) } } catch (parseErr) { console.error('JSON解析失败,原始内容:', e.data, '错误信息:', parseErr) } })
- Binance WebSocket接口在收到订阅请求后,会先返回一条订阅成功响应(结构为
{"result":null,"id":1}),该消息没有k属性,必须加事件类型判断才能避免读取到undefined。
内容的提问来源于stack exchange,提问作者Rakesh Poddar
相关产品推荐
相关产品推荐

