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