gpt4 book ai didi

javascript - NodeJS 流暂停/恢复不适用于 XMLHttpRequest,但适用于 curl?

转载 作者:搜寻专家 更新时间:2023-11-01 00:34:12 25 4
gpt4 key购买 nike

这是一个非常深奥的问题,我无法为其制作一个小的测试用例,所以提前道歉。但也许有人以前遇到过类似的事情。

我有这样的代码(使用 restify):

server.put("/whatever", function (serverRequest, serverResponse, next) {
serverRequest.pause();

serverRequest.on("data", function (chunk) {
console.log("from outside", chunk);
});

doSomeAsyncStuff(function (err) {
serverRequest.on("data", function (chunk) {
console.log("from inside", chunk);
});
serverRequest.on("end", function () {
next();
});

serverRequest.resume();
});
});

当我使用 CURL 访问此服务器时,效果很好。但是当我用 XMLHttpRequest 命中它时,我得到的 "from inside" 日志行比我得到的 "from outside" 日志行少了一个。似乎有一个数据事件丢失了,尽管我已尽最大努力尽快暂停。


这是我正在使用的 CURL 命令:

curl -X PUT -T file.pdf http://localhost:7070/whatever -v

下面是 XMLHttpRequest 代码(适用于最新版本的 Chrome):

var arrayBuffer = fromElsewhere();
var xhr = new XMLHttpRequest();

xhr.open("PUT", "http://localhost:7070/whatever");
xhr.setRequestHeader("Content-Length", arrayBuffer.byteLength);
xhr.setRequestHeader("Content-Type", "application/pdf");
xhr.send(arrayBuffer);

一个显着的区别是 CURL 似乎在上传之前发送 Expect: 100-continue,而 XMLHttpRequest 没有。我尝试手动添加该 header ,但当然它实际上并没有做太多事情(即 Chrome 没有等待响应,它只是发送了所有 PDF 数据以及原始请求)。即便如此,我不知道为什么这会影响事情。

最佳答案

可以预见的是,这与 curl 与 XMLHttpRequest 没有任何关系。 , 而不是 the fact that serverRequest.pause is only advisory; it doesn't actually pause right away .也就是说,它几乎没有用。

所以大概在 CURL 的情况下,时机足够好 pause实际上按预期工作,而在 XMLHttpRequest如果时间不对,"from outside" 之一data事件设法通过“咨询”暂停。

显然有各种修复方法,在线程中讨论过,但我对整个流/缓冲区世界仍然很不稳定,所以我不会尝试在这个答案中推荐一个。

我添加了一个 documentation pull request希望没有其他人尝试使用 pause假设它确实有效。

关于javascript - NodeJS 流暂停/恢复不适用于 XMLHttpRequest,但适用于 curl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com