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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:31