Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS流暂停/恢复不适用于XMLHttpRequest,但适用于curl?_Javascript_Http_Node.js_Xmlhttprequest_Arraybuffer - Fatal编程技术网

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

Javascript NodeJS流暂停/恢复不适用于XMLHttpRequest,但适用于curl?,javascript,http,node.js,xmlhttprequest,arraybuffer,Javascript,Http,Node.js,Xmlhttprequest,Arraybuffer,这是一个相当深奥的问题,我不能为它生成一个小的测试用例,所以提前表示歉意。但也许有人以前遇到过类似的事情 我有这样的代码(使用restify): 当我使用CURL访问这个服务器时,效果非常好。但是当我用XMLHttpRequest点击它时,我从内部得到的“日志行”比从外部得到的“日志行”少了一行。似乎有一个数据事件丢失了,尽管我尽了最大努力尽快暂停 下面是我正在使用的CURL命令: curl -X PUT -T file.pdf http://localhost:7070/whatever -

这是一个相当深奥的问题,我不能为它生成一个小的测试用例,所以提前表示歉意。但也许有人以前遇到过类似的事情

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

当我使用CURL访问这个服务器时,效果非常好。但是当我用XMLHttpRequest点击它时,我从内部得到的
“日志行”比从外部得到的
“日志行”少了一行。似乎有一个数据事件丢失了,尽管我尽了最大努力尽快暂停


下面是我正在使用的CURL命令:

curl -X PUT -T file.pdf http://localhost:7070/whatever -v
下面是
XMLHttpRequest
代码(适用于最新版本的Chrome):


一个显著的区别是CURL似乎在上传之前发送
Expect:100 continue
,而
XMLHttpRequest
则不发送。我尝试手动添加该标题,但它实际上没有做什么(即Chrome没有等待响应,它只是将所有PDF数据与原始请求一起发送)。即便如此,我也不知道这会产生什么影响。

某种程度上可以预见,这与curl和XMLHttpRequest之间没有任何关系,而是与。也就是说,它几乎毫无用处

因此,推测在CURL情况下,计时足够好,以至于
pause
实际按预期工作,而在
XMLHttpRequest
情况下,计时关闭,其中一个
“来自外部”
数据
事件成功地通过了“咨询”暂停

显然有各种各样的修复方法,在线程中进行了讨论,但我对整个流/缓冲区领域仍然非常不确定,所以我不会尝试在这个答案中推荐一种


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

某种程度上可以预见,这与curl与
XMLHttpRequest
没有任何关系,而是与。也就是说,它几乎毫无用处

因此,推测在CURL情况下,计时足够好,以至于
pause
实际按预期工作,而在
XMLHttpRequest
情况下,计时关闭,其中一个
“来自外部”
数据
事件成功地通过了“咨询”暂停

显然有各种各样的修复方法,在线程中进行了讨论,但我对整个流/缓冲区领域仍然非常不确定,所以我不会尝试在这个答案中推荐一种


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

嗯,
pause
有效,但正如您所提到的,它是建议性的,并且是异步的。
pause
的一个非常有用的用例是在代理中:从上游读取,然后向客户端写入。如果对客户端的写入返回
false
,则意味着缓冲区已满,您可以向后端发送
pause
。您可能会从后端收到一些额外的数据块,但不是所有的文件。如果不暂停,代理一个1GB文件会导致整个文件被缓冲到内存中(并且Node.js进程会爆炸)。我希望这有帮助!嗯,
pause
起作用,但正如您所提到的,它是建议性的,而且是异步的。
pause
的一个非常有用的用例是在代理中:从上游读取,然后向客户端写入。如果对客户端的写入返回
false
,则意味着缓冲区已满,您可以向后端发送
pause
。您可能会从后端收到一些额外的数据块,但不是所有的文件。如果不暂停,代理一个1GB文件会导致整个文件被缓冲到内存中(并且Node.js进程会爆炸)。我希望这有帮助!你得到答案了吗?如果我真的可以使用nodejs暂停/恢复http响应,你得到答案了吗?如果我真的可以使用nodejs暂停/恢复http响应?
curl -X PUT -T file.pdf http://localhost:7070/whatever -v
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);