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

rqenqsqc  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(312)

我正在尝试做一个非常基本的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
但它并不像两个地方承诺的那样像一根绳子一样出来。
为什么它不是以字符串的形式出现?

piwo6bdm

piwo6bdm1#

您可能使用了与教程不同的ws版本。看起来教程使用的是比v8更旧的版本,而您使用的是v8+版本。
changelog for 8.0.0
文本消息和关闭原因不再解码为字符串。它们作为Buffer传递给各自事件的侦听器。'message'事件的侦听器现在接受一个布尔参数,该参数指定消息是否为二进制(e173423)。
可以通过显式解码缓冲区来迁移现有代码。
第一个
这也描述了解决方案。
或者,您可以降级到ws的7.5.0版,以与本教程使用的版本相同:

npm i ws@7.5.0

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

cngwdvgl

cngwdvgl2#

在最新版本中,打印接收到的消息时需要提供**%s**。下面是来自npm WebSocket官方页面的简单代码片段。

ws.on('message', function message(data) {
  console.log('received: %s', data);
});
uklbhaso

uklbhaso3#

如果你使用console.log('${data}'),它不会显示〈Buffer。而如果你使用console.log(data),它会显示〈Buffer。

ws.on('message',data=>{
        console.log(`user sended:${data}`)
    })

你可以说是一个错误或正常。
改变方法:

ws.on('message',data=>{
        data=data.toString()
        console.log("user sended:",data)
    })

ws.on('message',data=>{
        console.log("user sended:",data.toString())
    })

相关问题