使用 Fetch API 读取分块的二进制响应

2023-11-25

如何使用 Fetch API 读取二进制分块响应。我正在使用以下代码,该代码可以从服务器读取分块响应。然而,数据似乎以某种方式编码/解码,导致getFloat32有时会失败。我尝试使用curl 读取响应,效果很好,这让我相信我需要做一些事情来使 fetch api 将块视为二进制。响应的内容类型正确设置为“application/octet-stream”。

const consume = responseReader => {
    return responseReader.read().then(result => {
        if (result.done) { return; }
        const dv = new DataView(result.value.buffer, 0, result.value.buffer.length);
        dv.getFloat32(i, true);  // <-- sometimes this is garbled up
        return consume(responseReader);
    });
}

fetch('/binary').then(response => {
    return consume(response.body.getReader());
})
.catch(console.error);

使用下面的express服务器来重现它。请注意,任何可以处理以下服务器的客户端 js 代码都可以。

const express = require('express');
const app = express();

app.get('/binary', function (req, res) {
  res.header("Content-Type", "application/octet-stream");
  res.header('Content-Transfer-Encoding', 'binary');
  const repro = new Uint32Array([0x417055b8, 0x4177d16f, 0x4179e9da, 0x418660e1, 0x41770476, 0x4183e05e]);
  setInterval(function () {
    res.write(Buffer.from(repro.buffer), 'binary');
  }, 2000);
});

app.listen(3000, () => console.log('Listening on port 3000!'));

使用上面的节点服务器 -13614102509256704 将被记录到控制台,但它应该只是〜16.48。如何检索原始写入的二进制浮点数?


正如您指出的那样,您的问题是

getFloat32 函数采用字节偏移量,有明确记录

但你的工作还有另一面。所以我会在这里添加

默认情况下,两者都不支持获取流FF and Chrome我更新了我的代码以处理两端的流。

const express = require('express');
const app = express();

app.get('/', function (req, res) {
    res.send(`
    <html>
    <body>
        <h1>Chrome reader</h1>
        <script>
            function dothis() {
var chunkedUrl = '/binary';
fetch(chunkedUrl)
  .then(processChunkedResponse)
  .then(onChunkedResponseComplete)
  .catch(onChunkedResponseError)
  ;

function onChunkedResponseComplete(result) {
  console.log('all done!', result)
}

function onChunkedResponseError(err) {
  console.error(err)
}

function processChunkedResponse(response) {
  var text = '';
  var reader = response.body.getReader()

  return readChunk();

  function readChunk() {
    return reader.read().then(appendChunks);
  }

  function appendChunks(result) {
      if (!result.done){
        var chunk = new Uint32Array(result.value.buffer);      
        console.log('got chunk of', chunk.length, 'bytes')
        console.log(chunk)
      }

    if (result.done) {
      console.log('returning')
      return "done";
    } else {
      console.log('recursing')
      return readChunk();
    }
  }
}            }
        </script>
    </body>
</html>

    `);
});

app.get('/firefox', function (req, res) {
    res.send(`
<html>
<head>
    <script src="./fetch-readablestream.js"></script>
    <script src="./polyfill.js"></script>
</head>
<body>
    <h1>Firefox reader</h1>
    <script>
    function readAllChunks(readableStream) {
                  const reader = readableStream.getReader();
                  const chunks = [];

                  function pump() {
                    return reader.read().then(({ value, done }) => {
                      if (done) {
                          console.log("its completed")
                        return chunks;
                      }
                      try{
                          console.log(new Int32Array(value.buffer))
                      }
                      catch (err) {
                          console.log("error occured - " + err)
                      }
                      return pump();
                    });
                  }

                  return pump();
            }

        function dothis() {


    fetchStream('/binary', {stream: true})
    .then(response => readAllChunks(response.body))
    .then(chunks => console.dir(chunks))
    .catch(err => console.log(err));
}            
        </script>
    </body>
</html>

    `);


});

app.get('/binary', function (req, res) {
    res.header("Content-Type", "application/octet-stream");
    res.header('Content-Transfer-Encoding', 'binary');
    const repro = new Uint32Array([0x417055b8, 0x4177d16f, 0x4179e9da, 0x418660e1, 0x41770476, 0x4183e05e]);
    i = 0;
    setTimeout(function abc() {
        res.write(Buffer.from(repro.buffer), 'binary');
        i++;
        if (i < 100) {
            setTimeout(abc, 100);
        } else {
            res.end();
        }
    }, 100)


    // I'm actually using spawn('command').pipe(res) here... So chunked response is required.
});
app.use(express.static('./node_modules/fetch-readablestream/dist/'))
app.use(express.static('./node_modules/web-streams-polyfill/dist/'))
app.listen(3000, () => console.log('Listening on port 3000!'));

现在它可以在 FF 上运行

FF

以及 Chrome

Chrome

你需要使用

https://www.npmjs.com/package/fetch-readablestream

我还使用了polyfillReadableStream in FF.

https://www.npmjs.com/package/web-streams-polyfill

但您可以通过更改 FF 配置文件首选项来启用相同的本机支持

FF config

添加到此处,以便将来可能对您或某人有所帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Fetch API 读取分块的二进制响应 的相关文章

  • 使用 jQuery 更改父元素样式

    我有下一个 html 设置 div class one div class two a href class three Click a div div 我想更改具有类的元素的背景颜色 one当我点击元素时 three使用 jQuery 这
  • 如何向上转型以限制对象属性

    在 JavaScript 中 如何从子类向上转换到超类以自动删除超类中不存在的对象属性 示例 假设有以下 2 个类 class ClassA constructor public a string public b string class
  • 带换行符的 React/Momentjs 日期格式

    我有一个日期字符串 我想对其进行格式化 其中数字位于月份下 Jul 6 我尝试了几种不同的方法来添加新行
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • 类型错误:类扩展值未定义不是函数或 null

    尝试创建这些实体时出现以下错误 TypeError Class extends value undefined is not a function or null 我假设这与循环依赖有关 但是在使用表继承和一对多关系时应该如何避免这种情况
  • 如何判断一个网页是否支持jquery?

    确定网页是否启用 jquery 的最佳方法是什么 如果这是确定它的最佳方法 则使用 jquery 本身 if jQuery jquery object exists jQuery 并不神奇 它本质上只是一个大对象 您可以像检查任何其他对象一
  • 在 jQuery .live() 方法中模拟“焦点”和“模糊”

    Update 从 jQuery 1 4 开始 live 现在支持focusin and focusout events jQuery http www jquery com currently1 doesn t support blur o
  • 使用 Firefox 插件 sdk 的 nsISocketTransportService

    我正在尝试使用 Firefox 来读取 SSH 横幅 IE 当您最初连接到 SSH 服务器时 服务器会向您发送其横幅 标识服务器软件 并且您向 SSH 服务器发送您的横幅 标识您的客户端软件 为此 我使用以下 URL 中的示例 firefo
  • 如何使 d3 饼图响应式?

    我有一个 PIE 图表 它工作正常 但我无法使其具有响应能力和可调整大小 我需要它与移动浏览器和 iPad 等兼容 div div
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 此页面上的脚本导致 ie 运行缓慢

    问题就在标题中 IE 行为异常 并说有一个脚本运行缓慢 FF 和 Chrome 没有这个问题 我怎样才能找到问题所在 那个页面有很多JS 手动检查不是一个好主意 EDIT 这是我正在处理的一个项目的页面 但我需要一个工具来查找问题 End
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • 如何在 select 和 option 标签中添加 JSON 数据?

    我有这个html代码 div class searchfilter div class searchwrapper div div
  • JavaScript 将键添加到数组中的每个值

    我下面有这个数组 它由一个简单的数组组成 我想要完成的是放一把钥匙id在每个数组值前面以实现类似的效果 id a id b id c id d 有没有一种简单的方法可以做到这一点 任何帮助将不胜感激 谢谢 var test a b c d
  • JavaScript中如何确保输入的值是数字而不是字符串?

    我创建了这个函数 function num var x prompt please enter your first number var y prompt please enter your second number if isNaN
  • 当我多次调用 requestAnimationFrame 时会发生什么

    我的意思是一次调用多个具有相同功能的 requestAnimationFrame function Draw DoSomething function AFunc prepare something requestAnimationFram
  • Web组件中嵌套槽的内容不可见

    我有一个 Web 组件 它应该接受任意元素来包装其内容 虽然我可以在 Chrome 开发工具中看到插槽已正确分配 但 DOM 中什么也没有出现 以前有人见过这个问题吗 定义 class ExampleParent extends HTMLE
  • 如何在画布上所有其他内容后面绘制图像? [复制]

    这个问题在这里已经有答案了 我有一块画布 我想用drawImage在画布上当前内容后面绘制图像 由于画布上已经有内容 我正在使用字面上的画布来创建包含图像的画布 因此我无法真正先绘制图像 所以我无法使用drawImage在我呈现其余内容之前
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3

随机推荐

  • 如何监控 Meteor.com 服务器端日志

    我正在寻找一种从部署为 myapp meteor com 的 Meteor 应用程序获取服务器日志的方法 理想情况下 我可以使用一个配置或包将远程服务器的日志实时发送到本地终端 Linux OSX 有没有直接的方法来实现这一目标 使用内置的
  • 在没有 JNLP 的情况下启动 Windows Jenkins 代理

    构建了一个新的 Windows Server 2016 作为 jenkins 协调构建的目标 我们不应该再使用oracle java 所以我得到了coretta openJDK OpenJDK 不再支持 javaws 可执行文件不随其一起提
  • 覆盖 HTTP 响应中的“缓存控制”值

    我有一个网页 当我访问材料时 该网页返回以下标头 HTTP 1 1 200 OK Date Sat 29 Jun 2013 15 57 25 GMT Server Apache Content Length 2247515 Cache Co
  • JavaFX 切换带有幻灯片效果的场景

    可以用幻灯片效果切换场景吗 我希望当我在舞台实例上调用 setScene 时 它以幻灯片效果改变场景 这是可能的 public class ManyScenes extends Application public static void
  • 在c++中将日期转换为unix时间戳

    正如一些转换unix时间戳的网站所说 时间戳 2013 05 07 05 01 00 yyyy mm dd hh mm ss is 1367902860 我在 C 中执行此操作的方式 标记与日期不同 这是代码 time t rawtime
  • jquery pjax请求发送两次

    我有一个 Rails 应用程序 但我不断收到 pjax 请求的奇怪行为 当我查看开发日志时 我可以看到正在发出两个请求 第一个请求是 pjax 下一个请求不是 结果页面仍然重新加载 如果有人能帮助我 我将不胜感激 JQuery pjax 插
  • 如何从 NSURLSession.sharedSession().dataTaskWithRequest 获取数据

    class PostFOrData let url NSURL string http 210 61 209 194 8088 SmarttvWebServiceTopmsoApi GetReadlist var picUrl NSURL
  • Java 源代码被 Intellij 中的反编译文件替换

    当我使用以下命令打开特定课程时Ctrl 右键单击我应该被重定向到一个包含 java 源代码的窗口 其中包含所有行和适当的注释 但我得到了一个带有反编译的 class 文件的窗口 我尝试停用反编译器插件 但它不起作用 如果我添加http do
  • 如何在Python中清空套接字?

    我需要清空套接字上的数据 确保没有任何内容可接收 不幸的是 python 套接字模块中没有此功能 我已经这样实现了一些东西 def empty socket sock remove the data present on the socke
  • VBA 中的格式(SomeDate,"MM/dd") = "12-15"

    我正在 Excel 中编写一个 VBA 宏 用于分析电子表格中的数据并发送电子邮件 在这个宏中 我必须附加格式为 MM dd 的日期 但输出的格式为 MM dd 所以问题是 为什么我的斜杠被破折号取代了 为简单起见 我已将代码简化为此示例
  • Marketplace Windows Phone Beta 测试错误代码:805a0194

    在市场中添加应用程序进行 Beta 测试后 当我尝试打开应用程序 Beta 测试人员中的链接时 显示错误代码 805a0194 并且没有一个测试人员可以下载应用程序进行测试 该怎么办 这是什么错误 将应用程序添加到应用程序中心已经过去了 2
  • GS1条码解析

    我们需要解析对方提供的 GS1 datamatrix 条码 我们知道他们将使用 GTIN 01 批号 10 有效期 17 序列号 21 问题是条码阅读器输出一个字符串 格式如下 01076123456789001710050310AC345
  • 随机不重复?

    我想编写一个程序 以随机顺序显示列表的所有元素而不重复 在我看来 它应该有效 但只能重复打印这些元素 import random tab for i in range 1 8 item random choice house word co
  • 如何使用 Python 单击 HTML 页面上的某些链接时打开 Windows 文件夹

    我正在编写以下程序 import os filepath r C TestData openfolder html abc open filepath w abc writelines abc writelines a href os st
  • 设置必须采用“名称=值”的形式。不知道该怎么办

    因此 我正在解析 Azure 存储帐户的连接字符串 当我到达使用连接字符串的应用程序页面时 编译器捕获一个异常 指出 设置必须采用 名称 值 的形式 这是否意味着我应该更正设置 appSettings 的 app config 文件中的某些
  • Angular 2 令人惊叹的动画

    Angular 2 RC2 刚刚问世 我想知道它是否已经支持交错动画 ngFor DSL语言文档提到group and sequence但没有任何形式的摇晃 RC2中不包含交错动画吗 我不确定我是否同意 G nter 的观点 即 ng co
  • 如何修复“模块‘tensorflow’没有属性‘估计器’”错误

    我正在使用 conda 通过 YAML 创建的 env pip 在我的 Linux Mint 盒子上设置 Tensorflow v1 13 1 环境 设置后 每当我尝试导入时tf estimator我收到AttributeError标题中描
  • 如何将 tweepy Twitter 流保存到文件中?

    我有一个工作脚本 可以成功收集提到 stackoverflow 的推文 但是 我想在 iPython 中运行该脚本 而不是执行单独的 py 文件 理想情况下 我只想打开它的 ipyb 文件 选择全部运行 然后让它运行一周左右 当然不要关闭我
  • 如何避免 cmd.exe 弹出命令窗口

    我有一个命令 cmd exe c ping 1 1 1 1 n 1 w 10000 echo second command goes here 但执行时它会打开一个命令窗口 有没有办法避免弹出命令窗口 PS 我无法从那里删除 cmd exe
  • 使用 Fetch API 读取分块的二进制响应

    如何使用 Fetch API 读取二进制分块响应 我正在使用以下代码 该代码可以从服务器读取分块响应 然而 数据似乎以某种方式编码 解码 导致getFloat32有时会失败 我尝试使用curl 读取响应 效果很好 这让我相信我需要做一些事情