为什么收到的 websocket 数据作为缓冲区出来?

Why is received websocket data coming out as a buffer?

我正在尝试做一个非常基本的 websocket,但我不明白为什么我没有收到字符串。

我正在为服务器使用来自 npm 的 ws 模块。 https://github.com/websockets/ws

客户:

    let socket = new WebSocket('wss://upload.lospec.com');

    socket.addEventListener('open', function (event) {
        socket.send('test');
    });

服务器:

const wss = new WebSocket.Server({ server });

wss.on("connection", function (ws) {
    ws.on("message", function (asdfasdf) {
        console.log("got new id from client",asdfasdf);
    });

服务器结果:

got new id from client <Buffer 74 65 73 74>

尝试按照文档中的示例以及本教程进行操作:https://ably.com/blog/web-app-websockets-nodejs

但它并没有像这两个地方所承诺的那样像字符串一样出现。

为什么这不是字符串形式?

您可能使用了与本教程不同的 ws 版本。好像教程用的是早于v8的版本,而你用的是v8+的版本。

来自changelog for 8.0.0

Text messages and close reasons are no longer decoded to strings. They are passed as Buffers to the listeners of their respective events. The listeners of the 'message' event now take a boolean argument specifying whether or not the message is binary (e173423).

Existing code can be migrated by decoding the buffer explicitly.

websocket.on('message', function message(data, isBinary) {
  const message = isBinary ? data : data.toString();
  // Continue as before.
});
websocket.on('close', function close(code, data) {
  const reason = data.toString();
  // Continue as before.
});

这也描述了解决方案。

或者,您可以降级到 ws 的 7.5.0 版,以与 what the tutorial uses 相提并论:

npm i ws@7.5.0

关于库文档中的示例“发送和接收文本数据”:我认为这是他们的疏忽,因为发布 v8 时没有更新此示例。您可以在 GitHub 上提出问题让他们知道。