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

如何将WebSocket连接句柄传递给Node.js子进程?

解决Node.js中WebSocket连接句柄传递给子进程的问题

在Node.js中,我们可以通过传递HTTP请求的socket句柄给子进程,让子进程直接响应请求,但在使用ws库的WebSocket服务器时,直接传递WebSocket连接对象会报错:This handle type cannot be sent。

问题原因

WebSocket连接对象本身不是可传递的句柄类型,但它内部包含了底层的TCP socket——在ws库中,这个socket对应连接对象的_socket私有属性。

解决方案

传递WebSocket连接底层的_socket句柄给子进程,而非连接对象本身,子进程可以通过该socket继续处理WebSocket通信。

主进程代码

const cp = require('child_process');
const k = cp.fork(childPath);
const ws = require('ws');
const server = new ws.WebSocketServer({ port: 5151 });

server.on('connection', (conn) => {
  // 传递底层TCP socket句柄
  k.send('ws-handle', conn._socket);
});

子进程代码

子进程可以用ws库将传递过来的socket包装为WebSocket实例,正常处理消息、关闭等事件:

const { WebSocket } = require('ws');

process.on('message', (msg, socket) => {
  if (msg === 'ws-handle') {
    // 用传入的socket初始化WebSocket实例
    const wsConn = new WebSocket(null, {
      socket: socket,
      skipUTF8Validation: true
    });

    // 处理WebSocket消息
    wsConn.on('message', (data) => {
      console.log('收到客户端消息:', data.toString());
      wsConn.send('子进程已收到消息');
    });

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

注意事项

  • _socket是ws库的私有属性,当前版本稳定可用,但后续版本可能存在变更风险。
  • 传递句柄后,主进程不能再对该socket进行任何操作,避免出现读写冲突。

内容的提问来源于stack exchange,提问作者Alexander Mills

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:15:33