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

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);
});

额外注意事项

  1. 确保tokenMetadata.mint在执行订阅逻辑时已经被正确赋值,避免出现undefined导致订阅失败。
  2. 建议给所有WebSocket连接添加close监听,处理连接断开后的资源清理或重连逻辑(如果需要)。

内容的提问来源于stack exchange,提问作者Wasiu Adeyemi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:00:03