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

Node.js从Binance WebSocket响应提取嵌套对象遇错求助

问题:Binance WebSocket API访问K线字段时报错

使用Node.js v19.8.1通过Binance WebSocket API订阅BNBBUSD的1分钟K线数据,尝试提取响应中k对象的s(交易对)或c(收盘价)字段时,出现错误:

TypeError: Cannot read properties of undefined (reading 's')

Binance返回的K线数据JSON结构如下:

{
  e: 'kline',
  E: 1680191074480,
  s: 'BNBBUSD',
  k: {
    t: 1680191040000,
    T: 1680191099999,
    s: 'BNBBUSD',
    i: '1m',
    f: 202374774,
    L: 202374788,
    o: '316.20000000',
    c: '316.30000000',
    h: '316.30000000',
    l: '316.20000000',
    v: '2.52200000',
    n: 15,
    x: false,
    q: '797.49570000',
    V: '0.39300000',
    Q: '124.30590000',
    B: '0'
  }
}

我编写的代码如下:

import WebSocket from 'ws';
import util from 'util';

const url = 'wss://stream.binance.com:9443/ws';

const ws = new WebSocket(url);

ws.on('message', (data, isBinary) => {
  data = JSON.parse(data);
  console.log(data['k']);
  const o = data['k'];
  console.log(o['s']);    //Getting error here but i'm not sure why
});

ws.on('open', () => {
  const bnbbusd = JSON.stringify({ method: 'SUBSCRIBE', params: [ 'bnbbusd@kline_1m' ], id: 1 });
  ws.send(bnbbusd);
  console.log(`< ${bnbbusd}`);
});

虽然打印data['k']能看到正确的K线对象,但访问其字段时仍报错。


原因分析

Binance WebSocket推送的消息不止K线数据,还会包含订阅确认消息(比如订阅成功后返回{"result":null,"id":1}),这类消息中没有k字段。报错的情况正是代码处理了这类非K线消息,此时data['k']为undefined,访问其属性自然会抛出错误。你看到的正确data['k']是K线推送的消息,但代码没有区分消息类型,导致处理非K线消息时出错。


解决方法

在处理消息时,先判断消息的事件类型(e字段)是否为kline,或者直接检查k字段是否存在,再去访问里面的属性。修改后的代码如下:

import WebSocket from 'ws';

const url = 'wss://stream.binance.com:9443/ws';

const ws = new WebSocket(url);

ws.on('message', (data, isBinary) => {
  const parsedData = JSON.parse(data);
  // 仅处理K线类型的消息
  if (parsedData.e === 'kline' && parsedData.k) {
    const kline = parsedData.k;
    console.log(`交易对:${kline.s}`);
    console.log(`收盘价:${kline.c}`);
  } else {
    // 处理其他消息(如订阅确认)
    console.log('非K线消息:', parsedData);
  }
});

ws.on('open', () => {
  const subscribeMsg = JSON.stringify({ 
    method: 'SUBSCRIBE', 
    params: [ 'bnbbusd@kline_1m' ], 
    id: 1 
  });
  ws.send(subscribeMsg);
  console.log(`发送订阅消息: ${subscribeMsg}`);
});

修改说明

  • 增加了消息类型判断:通过parsedData.e === 'kline'确认是K线数据,同时检查parsedData.k是否存在,避免空值访问
  • 对非K线消息做了单独处理,既不会报错,也能看到订阅确认等系统消息

内容的提问来源于stack exchange,提问作者extensa5620

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:13:27