【问题标题】:Why is received websocket data coming out as a buffer?为什么接收到的 websocket 数据作为缓冲区出来?
【发布时间】:2021-10-07 17:24:40
【问题描述】:

我正在尝试做一个非常基本的 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

但它不像两个地方都承诺的那样输出。

为什么这不是一个字符串?

【问题讨论】:

    标签: node.js websocket ws


    【解决方案1】:

    您可能使用与教程不同的ws 版本。看来本教程使用的是比 v8 更早的版本,而您使用的是 v8+ 版本。

    来自changelog for 8.0.0

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

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

    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 上打开一个问题让他们知道。

    【讨论】:

    • 谢谢,这是有道理的(现在看来确实有效)。
    • 另外我想知道文档示例中的 %s 部分是否会自动强制将其转换为字符串,这就是不需要 toString 的原因(我怀疑 JSON.stringify 也会这样做,我见过几次排除toString)
    • 即使这样,这个例子也会产生误导,正如从这个问题中显而易见的那样。
    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多