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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:10:26