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

