Express服务器通过WebSocket连接twelvedata无法订阅接收数据
问题分析与修复方案
代码中的核心问题
- 事件使用错误:
connection是WebSocket服务器端专属事件,客户端连接远程服务时无需监听;向服务器发送订阅请求不能用ws.emit(),这是本地事件触发逻辑,无法将消息发送给远程服务器。 - 消息格式错误:发送给服务器的订阅数据必须转为JSON字符串,不能直接传递JavaScript对象。
- 返回数据监听事件错误:服务器推送的行情数据会通过
message事件传递,而非subscribe事件。
修正后的代码
import * as dotenv from 'dotenv' import WebSocket from 'ws'; import express from 'express' const app = express(); // 加载环境变量 dotenv.config() // 初始化WebSocket连接 const ws = new WebSocket(`wss://ws.twelvedata.com/v1/quotes/price?apikey=${process.env.API_KEY_TWELVEDATA}`); const payload = { "action": "subscribe", "params": { "symbols": "AAPL,INFY,TRP,QQQ,IXIC,EUR/USD,USD/JPY,BTC/USD,ETH/BTC" }, }; // 连接成功时触发 ws.on('open', () => { console.log("已连接到twelvedata WebSocket服务器"); // 将订阅对象转为JSON字符串发送给服务器 ws.send(JSON.stringify(payload)); }); // 接收服务器返回的消息 ws.on('message', (data) => { try { // 解析JSON格式的返回数据 const parsedData = JSON.parse(data); console.log("收到行情数据:", parsedData); } catch (err) { console.error("解析数据失败:", err); } }); // 监听连接错误 ws.on('error', (err) => { console.error("WebSocket连接错误:", err); }); // 监听连接关闭 ws.on('close', () => { console.log("WebSocket连接已关闭"); }); const port = process.env.PORT || 5000; app.listen(port, () => { console.log(`Express服务运行在端口${port}`); });
关键修正点说明
- 移除多余的
connection事件监听,直接用客户端open事件处理连接成功后的订阅操作。 - 使用
ws.send(JSON.stringify(payload))发送订阅请求,确保数据格式符合服务器要求。 - 通过
message事件接收服务器推送的所有数据,并解析为JSON对象便于处理。 - 添加
error和close事件监听,方便排查连接异常问题。
内容的提问来源于stack exchange,提问作者Abdullah Ch
相关产品推荐
相关产品推荐

