NestJS连接Binance WebSocket API失败:无法输出连接日志求助
解决NestJS连接Binance WebSocket API失败的问题
你代码里的核心问题有两个:
- Binance的WebSocket API不支持Socket.io协议,socket.io-client是专门用于连接Socket.io服务端的工具,和原生WebSocket协议不兼容
- 你连接的地址是Binance的REST API地址(
https://api.binance.com),WebSocket服务的正确地址是wss://stream.binance.com:9443这类
下面给出两种可行的实现方式:
方法一:使用原生WebSocket(基于ws库)
首先安装依赖:
npm install ws
然后修改NestJS服务代码:
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; import * as WebSocket from 'ws'; @Injectable() export class BinanceGateway implements OnModuleInit, OnModuleDestroy { private wsClient: WebSocket; onModuleInit() { // 示例连接BTCUSDT的实时交易流,可根据需求替换端点 this.wsClient = new WebSocket('wss://stream.binance.com:9443/ws/btcusdt@trade'); this.wsClient.on('open', () => { console.log('connected to the binance'); // 若需订阅自定义流,可在此发送JSON格式的订阅指令 }); this.wsClient.on('message', (data) => { const parsedData = JSON.parse(data.toString()); console.log('收到Binance数据:', parsedData); }); this.wsClient.on('error', (err) => { console.error('Binance WebSocket连接错误:', err); }); this.wsClient.on('close', () => { console.log('Binance WebSocket连接关闭'); }); } onModuleDestroy() { // 模块销毁时主动关闭连接,避免资源泄漏 if (this.wsClient) { this.wsClient.close(); } } }
方法二:使用官方封装的SDK(更简便)
使用binance-api-node库,它已经封装了Binance的WebSocket和REST API,无需手动处理连接细节:
首先安装依赖:
npm install binance-api-node
然后编写服务代码:
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; import Binance from 'binance-api-node'; @Injectable() export class BinanceGateway implements OnModuleInit, OnModuleDestroy { private binanceClient; private streamSubscription; onModuleInit() { // 创建客户端(如需API密钥,可传入{ apiKey: 'xxx', apiSecret: 'xxx' }) this.binanceClient = Binance(); // 订阅BTCUSDT的实时交易流 this.streamSubscription = this.binanceClient.ws.trades('BTCUSDT', (tradeData) => { console.log('收到交易数据:', tradeData); }); console.log('connected to the binance'); } onModuleDestroy() { // 取消订阅,释放资源 if (this.streamSubscription) { this.streamSubscription.unsubscribe(); } } }
额外注意点
- Binance提供多种WebSocket流端点(行情、深度、K线等),可根据业务需求替换对应的端点路径
- 确保你的NestJS模块已经注册了这个服务,否则
onModuleInit生命周期钩子不会执行
内容的提问来源于stack exchange,提问作者Abolfazl Jalildoost
相关产品推荐
相关产品推荐

