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

Node.js WebSocket服务器向指定客户端转发数据遇类型错误求助

Node.js WebSocket服务器转发数据报错排查

我用Node.js搭建了WebSocket服务器,需求是两个客户端连接后,当客户端1向服务器发送数据时,服务器将数据转发给客户端2。参考相关方案实现后,运行出现如下错误:

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Object
    at new NodeError (node:internal/errors:371:5)
    at Function.from (node:buffer:323:9)
    at toBuffer (/home/ttt/node_modules/ws/lib/buffer-util.js:95:18)
    at Sender.send (/home/ttt/node_modules/ws/lib/sender.js:315:14)
    at WebSocket.send (/home/ttt/node_modules/ws/lib/websocket.js:467:18)
    at WebSocket.<anonymous> (/home/ttt/STT_project/sttproject/IHM_server/websocketServer.js:43:15)
    at WebSocket.emit (node:events:526:28)
    at Receiver.receiverOnMessage (/home/ttt/node_modules/ws/lib/websocket.js:1137:20)
    at Receiver.emit (node:events:526:28)
    at Receiver.dataMessage (/home/ttt/node_modules/ws/lib/receiver.js:528:14) 
  code: 'ERR_INVALID_ARG_TYPE'

尝试多种方法仍未解决,求帮忙排查问题,或提供更优实现方案。我的代码示例如下:

wss.on("connection", ws => {
    ws.id = id++;
    lookup[ws.id] = ws;

    ws.on("message", data => {
    if(data.toString() != "\n")
    {
      message = {
        "message": 
          {
            "text": data.toString(),
            "end": false
          }
      }
    }
    else {
      message = {
        "message": 
          {
            "text": "",
            "end": true
          }
      }
    }
    lookup[0].send('message');

    })
...

问题排查与修正方案

  1. 核心错误原因:ws.send()方法不支持直接发送JavaScript对象,必须传入字符串、Buffer或其他指定类型。你的代码里要么是误传了字符串'message'(并非构建的对象),要么是直接传递了message对象,这两种情况都会触发报错。

  2. 代码修正点:

    • 声明message变量,避免全局变量污染;
    • 将构建好的message对象转为JSON字符串再发送;
    • 优化客户端转发逻辑,确保找到当前客户端之外的另一个连接;
    • 修正换行符判断的写法,避免无效判断。

修正后的代码示例:

let id = 0;
const lookup = {};

wss.on("connection", ws => {
    ws.id = id++;
    lookup[ws.id] = ws;
    console.log(`客户端 ${ws.id} 已连接`);

    ws.on("message", data => {
        const receivedText = data.toString().trim();
        let message;
        
        if (receivedText) {
            message = {
                "message": {
                    "text": receivedText,
                    "end": false
                }
            };
        } else {
            message = {
                "message": {
                    "text": "",
                    "end": true
                }
            };
        }

        // 转发给另一个已连接的客户端
        const targetWs = Object.values(lookup).find(client => client.id !== ws.id);
        if (targetWs) {
            targetWs.send(JSON.stringify(message));
        } else {
            console.log("目标客户端未连接,无法转发");
        }
    });

    ws.on("close", () => {
        delete lookup[ws.id];
        console.log(`客户端 ${ws.id} 已断开`);
    });
});
  1. 额外优化建议:
    • 增加连接数校验,仅当两个客户端都在线时才执行转发;
    • 给send方法添加错误捕获,避免单个客户端异常导致服务器崩溃;
    • 可以通过握手时的Query参数给客户端设置业务标识,替代依赖id顺序的转发逻辑,扩展性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:39:09