【问题标题】:Client JavaScript Problem in unzipped Gzip data form webSocket解压缩 Gzip 数据表单 webSocket 中的客户端 JavaScript 问题
【发布时间】:2020-12-27 22:55:42
【问题描述】:

我有一个通过 WebSocket 向我发送数据的服务,但是数据是 gzip 压缩的。当我尝试解压缩 Blob 数据时,我遇到了问题。我使用包fflategzip-jspakozlib都有不同的错误,但是当我用包node-gzip编写node js Server的代码时很有趣 哪个底层使用了上面提到的zlib 包,一切都很好,数据将被取消压缩。

Client.js(问题是 unGzip 数据)

let ws = new WebSocket('wss://api.huobi.pro/ws');

var zlib = require('zlib');;

let zip = {
    gzip: function gzip(input, options) {
        return new Promise(function (resolve, reject) {
            zlib.gzip(input, options, function (error, result) {
                if (!error) resolve(result); else reject(Error(error));
            });
        });
    },
    ungzip: function ungzip(input, options) {
        return new Promise(function (resolve, reject) {
            zlib.gunzip(input, options, function (error, result) {
                if (!error) resolve(result); else reject(Error(error));
            });
        });
    }
};

ws.onopen = ( function () {
    ws.send(`{
                "sub": "market.ethbtc.kline.1min",
                "id": "id1"
            }`);
});

ws.onmessage = async function (event) {
    console.log(await zip.ungzip(event.data));
};

错误:未捕获(承诺中)错误: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 方法时,有一些乱码,上面的大多数库和包都表示数据头未知

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

请帮我解压数据

在上面的 Node.js 代码中解压后的示例响应数据 我希望在我的 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
  }
}

【问题讨论】:

    标签: javascript node.js websocket gzip


    【解决方案1】:

    如果您将console.log 的值设为event.data,您会发现它实际上是Blob。不能直接使用,必须转换成Uint8Array

    我还注意到端点返回压缩后的 JSON,所以我也会对其进行解析。

    我的解决方案:

    import { gunzip, strFromU8 } from 'fflate'; 
    // If you can't use ES Modules:
    // const { gunzip, strFromU8 } = require('fflate');
    const ws = new WebSocket('wss://api.huobi.pro/ws');
    ws.onopen = function() {
      ws.send(JSON.stringify({
        sub: 'market.ethbtc.kline.1min',
        id: 'id1'
      }));
    }
    ws.onmessage = function(event) {
      const fr = new FileReader();
      fr.onload = function() {
        gunzip(
          new Uint8Array(fr.result),
          function(err, raw) {
            if (err) {
              console.error(err);
              return;
            }
            const data = JSON.parse(strFromU8(raw));
            // Use the data variable however you wish
          }
        );
      }
      fr.readAsArrayBuffer(event.data);
    }
    

    【讨论】:

    • 谢谢你,我认为浏览器将 gzip 数据放到 Blob 对象中 相同的代码在 Express 应用程序中工作 很好,为什么我不能做任何我从未使用过 Blob 对象的事情,并尝试在希望也许数据是解压缩的,但没有 UnGzip 数据是数据再次感谢:)
    【解决方案2】:

    无论使用何种模式,这两个示例之间都有明显的区别。
    如果这不起作用(因为它会尝试立即访问,而无需等待承诺):

    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)
    }
    

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

    【讨论】:

    • 对不起,我更新了我的 Client.js 我已经完成了,只是想成为短代码。还是有错误
    • 老实说(NodeJS 也不关心)你想要什么;你必须使用它返回的东西。您根本不能只以同步方式使用异步方法;这永远不会成功。
    • 数据是Node.js可以使用但是在客户端(浏览器端)不可用
    • @Milad 请看这里:nodejs.dev/learn/understanding-javascript-promises ...这可能会更详细地解释我要说的内容。 Promise 不是结果,但它保证您将来会提供结果……这就是为什么您必须等待 .then() 的原因。我什至不确定 gzip 不会被透明地解压缩。
    • 谢谢,@martin-zeitler 我知道 Promise 我遇到的问题是关于读取 Blob 数据浏览器将 gzip 数据放入 Blob 对象中,这就是为什么我无法将数据解压缩为 101arrowz 告诉我如何打开Blob 数据,然后解压缩该数据,再次感谢您为我提供的帮助 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2010-10-23
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多