使用ws库的TypeScript WebSocket Server调用send触发数据类型错误求助
解决ws库WebSocket Server发送数据时的TypeError问题
我看到你遇到的问题了——WebSocket连接正常建立,但调用send方法时抛出类型错误,提示发送的数据不是字符串或buffer而是对象。咱们一步步来排查和解决:
问题根源
ws库的send()方法不支持直接发送JavaScript对象,它只接受以下几种合法数据类型:
- 字符串
- Buffer
- TypedArray(比如Uint8Array这类)
- DataView
哪怕你贴的示例代码里写的是ws.send('something'),如果实际业务代码中不小心传入了对象,就会触发这个错误。
具体解决方案
1. 发送对象时先序列化为JSON字符串
如果需要传输对象数据,先把它转成JSON字符串,接收端再解析回对象即可:
// 服务端发送对象的正确写法 const dataToSend = { status: 'success', content: 'hello client' }; ws.send(JSON.stringify(dataToSend)); // 客户端接收时解析(可选) ws.on('message', (message) => { const parsedData = JSON.parse(message.toString()); console.log('Received parsed data:', parsedData); });
2. 检查send调用的实际参数类型
回头排查你的代码,确认你调用send时传入的内容确实是合法类型。比如如果是变量,要确保变量值不是对象:
// 错误示例:不小心传入了对象 const wrongData = { msg: 'oops' }; ws.send(wrongData); // 这就会触发你看到的错误 // 正确示例:传入字符串或buffer const rightData = 'something'; ws.send(rightData);
3. 添加错误监听辅助排查
可以给WebSocket实例加上error事件监听,获取更详细的错误细节,方便定位问题:
ws.on('error', (error) => { console.error('WebSocket发送/接收错误:', error); });
针对你代码的额外小提示
你代码里用普通函数作为connection的回调,这里的this会指向错误的上下文(不是你的类实例),如果this.webs = ws是想把连接实例存到类属性里,建议改成箭头函数:
this.wss.on('connection', (ws, req) => { this.webs = ws; // 现在this正确指向你的类实例了 console.log(req); ws.on('message', (message) => { console.log('received: %s', message); ws.send('something'); // 这里传入字符串是合法的 console.log("Send Changed Message"); }); });
这样既能正确保存ws实例,也避免了普通函数带来的this指向问题,可能还能解决一些隐藏的潜在错误。
内容的提问来源于stack exchange,提问作者user3767693
相关产品推荐
相关产品推荐

