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
相关产品推荐
相关产品推荐

