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

sta*_*ers 16 websocket node.js ws

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

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

客户:

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

    socket.addEventListener('open', function (event) {
        socket.send('test');
    });
Run Code Online (Sandbox Code Playgroud)

服务器:

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

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

服务器结果:

got new id from client <Buffer 74 65 73 74>
Run Code Online (Sandbox Code Playgroud)

尝试遵循文档上的示例以及本教程:https://ously.com/blog/web-app-websockets-nodejs

但它并没有像两个地方所承诺的那样像一条线一样出来。

为什么这不以字符串形式出现?

Che*_*yDT 38

ws您可能使用与教程不同的版本。看起来教程使用的是 v8 之前的版本,而您使用的是 v8+ 版本。

来自8.0.0 的变更日志

文本消息和关闭原因不再解码为字符串。它们作为 s 传递Buffer给各自事件的侦听器。事件的侦听器'message'现在采用布尔参数来指定消息是否为二进制 ( e173423)。

可以通过显式解码缓冲区来迁移现有代码。

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

这也描述了解决方案。

或者,您可以降级到 7.5.0 版本,以与教程使用的版本ws保持一致:

npm i ws@7.5.0
Run Code Online (Sandbox Code Playgroud)

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