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'); }) ...
问题排查与修正方案
核心错误原因:
ws.send()方法不支持直接发送JavaScript对象,必须传入字符串、Buffer或其他指定类型。你的代码里要么是误传了字符串'message'(并非构建的对象),要么是直接传递了message对象,这两种情况都会触发报错。代码修正点:
- 声明
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} 已断开`); }); });
- 额外优化建议:
- 增加连接数校验,仅当两个客户端都在线时才执行转发;
- 给
send方法添加错误捕获,避免单个客户端异常导致服务器崩溃; - 可以通过握手时的Query参数给客户端设置业务标识,替代依赖id顺序的转发逻辑,扩展性更强。
内容的提问来源于stack exchange,提问作者CLBS
相关产品推荐
相关产品推荐

