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

Node.js中Twelvedata WebSocket订阅事件发送与参数传递问题

问题

我在Node.js中尝试连接Twelvedata服务器WebSocket的代码如下:

import * as dotenv from 'dotenv' 
import WebSocket from 'ws';

//setting up env
dotenv.config()

// setting up the websocket
const ws = new WebSocket(`wss://ws.twelvedata.com/v1?symbol=AAPL?apikey=${process.env.API_KEY_TWELVEDATA}`);

ws.on('subscribe', (stream) => {
  console.log('stream ==>', stream);
})

我无法按照Twelvedata API的要求发送subscribe事件,也不清楚如何传递文档指定的参数。文档给出的订阅参数示例如下:

{ "action": "subscribe", 
  "params": {
    "symbols": [{
        "symbol": "AAPL",
        "exchange": "NASDAQ"
      }, {
        "symbol": "RY", 
        "mic_code": "XNYS"
      }, {
        "symbol": "DJI",
        "type": "Index"
      }
  ]
 }
}

请问该如何通过WebSocket发送上述订阅事件及对应参数?

解决方案

你需要修正几个关键问题,以下是完整的实现步骤:

1. 修正WebSocket连接URL

原URL中用了两个?分隔参数,这是错误的,应该用&拼接查询参数。另外Twelvedata的WebSocket订阅不需要在URL里指定symbol,订阅参数通过后续发送的消息传递即可:

const ws = new WebSocket(`wss://ws.twelvedata.com/v1?apikey=${process.env.API_KEY_TWELVEDATA}`);

2. 连接成功后发送订阅消息

WebSocket建立连接后(通过open事件监听),需要将订阅参数对象转换为JSON字符串,通过ws.send()方法发送给服务器:

ws.on('open', () => {
  // 构造订阅消息
  const subscribeMsg = {
    "action": "subscribe", 
    "params": {
      "symbols": [
        { "symbol": "AAPL", "exchange": "NASDAQ" },
        { "symbol": "RY", "mic_code": "XNYS" },
        { "symbol": "DJI", "type": "Index" }
      ]
    }
  };
  // 发送JSON格式的消息
  ws.send(JSON.stringify(subscribeMsg));
  console.log("订阅消息已发送");
});

3. 监听服务器返回的消息

服务器的实时数据流会通过message事件返回,而非subscribe事件,你需要监听这个事件来接收数据:

ws.on('message', (data) => {
  // 解析服务器返回的JSON数据
  const streamData = JSON.parse(data);
  console.log("实时数据:", streamData);
});

4. 添加错误和关闭监听(可选但推荐)

添加这些监听可以帮助你排查连接或订阅中的问题:

ws.on('error', (error) => {
  console.error("WebSocket错误:", error);
});

ws.on('close', () => {
  console.log("WebSocket连接已关闭");
});

完整代码

import * as dotenv from 'dotenv' 
import WebSocket from 'ws';

dotenv.config();

// 建立WebSocket连接
const ws = new WebSocket(`wss://ws.twelvedata.com/v1?apikey=${process.env.API_KEY_TWELVEDATA}`);

// 连接成功时发送订阅请求
ws.on('open', () => {
  const subscribeMsg = {
    "action": "subscribe", 
    "params": {
      "symbols": [
        { "symbol": "AAPL", "exchange": "NASDAQ" },
        { "symbol": "RY", "mic_code": "XNYS" },
        { "symbol": "DJI", "type": "Index" }
      ]
    }
  };
  ws.send(JSON.stringify(subscribeMsg));
  console.log("已发送订阅请求");
});

// 接收实时数据流
ws.on('message', (data) => {
  const streamData = JSON.parse(data);
  console.log("实时数据:", streamData);
});

// 监听错误
ws.on('error', (error) => {
  console.error("连接错误:", error);
});

// 监听连接关闭
ws.on('close', () => {
  console.log("连接已关闭");
});

内容的提问来源于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.11 16:01:30