Node.js中使用WS包实现WebSocket多连接失败求助
问题分析与解决方案
你当前的问题核心是:第二个WebSocket实例wss在文件顶部就已创建,它的open事件可能在第一个连接ws关闭前就已经触发,等你在ws的close回调里再绑定wss的open监听时,这个事件已经发生过,导致回调永远不会执行。此外还要注意tokenMetadata.mint的作用域是否能被正确访问。
以下是两种可行的修复方案:
方案一:在第一个连接关闭后再创建第二个连接
这种方式能确保第二个连接的open事件是在第一个连接关闭后才触发,避免监听绑定不及时的问题。
const ws = new WebSocket("wss://pumpportal.fun/api/data"); ws.on("open", function open() { // 订阅代币创建事件 let payload = { method: "subscribeNewToken", }; ws.send(JSON.stringify(payload)); }); ws.on("close", (event) => { // 第一个连接关闭后,才创建第二个连接实例 const wss = new WebSocket("wss://pumpportal.fun/api/data"); wss.on("open", function open() { console.log("WSS Action..."); // 确保tokenMetadata.mint在此作用域内已正确赋值 let payload = { method: "subscribeTokenTrade", keys: [tokenMetadata.mint], }; wss.send(JSON.stringify(payload)); }); // 新增错误监听,方便排查连接问题 wss.on("error", (err) => { console.error("WSS连接异常:", err); }); });
方案二:提前创建第二个连接,用标志位控制订阅逻辑
如果需要提前初始化第二个连接,但只在第一个连接关闭后执行订阅操作,可以通过标志变量控制逻辑触发时机:
let isFirstConnClosed = false; const ws = new WebSocket("wss://pumpportal.fun/api/data"); const wss = new WebSocket("wss://pumpportal.fun/api/data"); ws.on("open", function open() { let payload = { method: "subscribeNewToken", }; ws.send(JSON.stringify(payload)); }); ws.on("close", (event) => { isFirstConnClosed = true; // 如果第二个连接已经处于打开状态,直接发送订阅请求 if (wss.readyState === WebSocket.OPEN) { sendTradeSubscription(wss); } }); // 提前监听第二个连接的open事件,但仅在第一个连接关闭后执行订阅 wss.on("open", function open() { console.log("WSS Action..."); if (isFirstConnClosed) { sendTradeSubscription(wss); } }); // 封装订阅逻辑,避免代码重复 function sendTradeSubscription(conn) { let payload = { method: "subscribeTokenTrade", keys: [tokenMetadata.mint], }; conn.send(JSON.stringify(payload)); } // 新增错误监听 wss.on("error", (err) => { console.error("WSS连接异常:", err); });
额外注意事项
- 确保
tokenMetadata.mint在执行订阅逻辑时已经被正确赋值,避免出现undefined导致订阅失败。 - 建议给所有WebSocket连接添加
close监听,处理连接断开后的资源清理或重连逻辑(如果需要)。
内容的提问来源于stack exchange,提问作者Wasiu Adeyemi
相关产品推荐
相关产品推荐

