You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:06:04