解压缩的Gzip数据表单webSocket中的客户端JavaScript问题

解压缩的Gzip数据表单webSocket中的客户端JavaScript问题,javascript,node.js,websocket,gzip,Javascript,Node.js,Websocket,Gzip,我有一个通过WebSocket向我发送数据的服务,但是数据是gzip的。当我尝试取消压缩Blob数据时,我遇到了一个问题。我使用了包,所有这些都有不同的错误,但当我用包为NodeJSServer编写代码时,有趣的是 哪个引擎盖下使用了上面提到的软件包是好的,数据将被取消 Client.js(问题是解压缩数据) 错误:未捕获(承诺中)错误:TypeError:无效 非字符串/缓冲区块 Node.js正在工作 const {ungzip} = require('node-gzip'); ws =

我有一个通过WebSocket向我发送数据的服务,但是数据是gzip的。当我尝试取消压缩Blob数据时,我遇到了一个问题。我使用了包,所有这些都有不同的错误,但当我用包为NodeJSServer编写代码时,有趣的是 哪个引擎盖下使用了上面提到的软件包是好的,数据将被取消

Client.js(问题是解压缩数据)

错误:未捕获(承诺中)错误:TypeError:无效 非字符串/缓冲区块

Node.js正在工作

const {ungzip} = require('node-gzip');

ws = new WebSocket('wss://api.huobi.pro/ws');
    
    ws.on('open', function () {
            ws.send('{
                "sub": "market.ethbtc.kline.1min",
                "id": "id1"
            }');
        });
    
     ws.on('message', function (data) {
            ungzip(data).then((r) => {
                let data = JSON.parse(r.toString());
                console.log(data); 
            }).catch(console.error)
        }); 
在浏览器中,
event.data
是Blob数据,当我使用
text
方法时,它们上面有一些jibberish代码,上面的大多数库和包都说数据头未知

但是为什么相同的数据点具有相同的结构—一个在node.js上工作—另一个不在浏览器中工作

请帮我解压缩数据

在上面的Node.js代码中取消ziped后的示例响应数据 我希望我的Client.js中也有同样的内容

{
  "ch": "market.ethbtc.kline.1min",
  "ts": 1489474082831, //system update time
  "tick": {
    "id": 1489464480,
    "amount": 0.0,
    "count": 0,
    "open": 7962.62,
    "close": 7962.62,
    "low": 7962.62,
    "high": 7962.62,
    "vol": 0.0
  }
}

无论使用何种模式,这两个示例之间都存在明显的差异。
如果这不起作用(因为它试图立即访问,而不等待承诺):

只需以与工作版本相同的方式访问即可:

ws.onmessage = function (data) {
    gzip.unzip(data)
    .then((result) => {
        let data = JSON.parse(result.toString());
        console.log(data); 
    })
    .catch(console.error)
}

gzip.unzip
unzip
可能都会返回一个承诺。

如果您
console.log
记录
event.data
的值,您将看到它实际上是一个承诺。您不能直接使用它,而是必须转换为
Uint8Array

我还注意到端点返回gzip JSON,所以我也将解析它

我的解决方案:

从'fflate'导入{gunzip,strFromU8};
//如果无法使用ES模块:
//const{gunzip,strFromU8}=require('fflate');
const ws=新的WebSocket('wss://api.huobi.pro/ws');
ws.onopen=函数(){
发送(JSON.stringify)({
sub:“market.ethbtc.kline.1分钟”,
id:'id1'
}));
}
ws.onmessage=函数(事件){
const fr=new FileReader();
fr.onload=函数(){
枪口(
新的UINT8阵列(fr.result),
函数(错误、原始){
如果(错误){
控制台错误(err);
返回;
}
const data=JSON.parse(strFromU8(raw));
//根据需要使用数据变量
}
);
}
fr.readAsArrayBuffer(事件数据);
}

很抱歉,我更新了Client.js,我已经这么做了,只是希望代码简短。仍然有错误我诚实地(也不是NodeJS)关心你想要什么;你必须使用它返回的内容。您不能仅仅以同步方式使用异步方法;这永远不会成功。数据是Node.js可以使用,但在客户端(浏览器端)是unusable@Milad请看这里:……这可能会更详细地解释我想说的。一个
承诺
不是一个结果,但它承诺你将来会有结果……这就是为什么你必须等待
。然后()。我甚至不能确定gzip不会被透明地解压。谢谢,@martin zeitler我知道关于Promise我遇到的问题是关于读取Blob数据浏览器将gzip数据放入Blob对象中这就是为什么我无法解压数据,正如101箭头所示演示如何打开Blob数据,然后解压数据再次感谢您的帮助:)谢谢,我认为浏览器将gzip数据放在Blob对象中相同的代码在Express应用程序中工作很好,这就是为什么我不能做任何事情我从来没有使用Blob对象并尝试读取它们,希望数据可能是未压缩的,但不是未压缩的数据是数据再次感谢:)
ws.onmessage = function (event) {
    console.log(gzip.unzip(event.data));
}
ws.onmessage = function (data) {
    gzip.unzip(data)
    .then((result) => {
        let data = JSON.parse(result.toString());
        console.log(data); 
    })
    .catch(console.error)
}