2

これは非常に難解な問題であり、小さなテスト ケースを作成することはできません。あらかじめご了承ください。しかし、誰かが以前に似たようなことに遭遇したことがあるかもしれません。

次のようなコードがあります(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"ログ行よりもログ行が 1 行少なくなります"from outside"。できるだけ早く一時停止するよう最善を尽くしていますが、データ イベントの 1 つが失われているようです。


私が使用している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);

顕著な違いの 1 つは、CURL はExpect: 100-continueアップロード前に送信するように見えますが、送信XMLHttpRequestしないことです。そのヘッダーを手動で追加しようとしましたが、もちろん実際にはあまり効果がありませんでした (つまり、Chrome は応答を待たず、元の要求と共にすべての PDF データを送信しただけです)。それでも、なぜこれが影響を与えるのかわかりません。

4

1 に答える 1

4

ある程度予想通り、これは curl とは関係XMLHttpRequestがなく、代わりに単なるアドバイスであるという事実とは関係ありません。serverRequest.pause実際にはすぐには一時停止しません。つまり、ほとんど役に立たない。

したがって、おそらく CURL の場合、タイミングが十分に良好であり、pause実際に期待どおりに機能したのに対しXMLHttpRequest、タイミングがずれていて、"from outside" dataイベントの 1 つが「推奨」一時停止をすり抜けることができたのとは対照的です。

スレッドで説明されているように、これにはさまざまな修正があるようですが、このストリーム/バッファーの世界全体についてはまだかなり不安定なので、この回答では推奨しません。

実際に機能すると仮定して、他の誰も使用しようとしないことを期待して、ドキュメントのプル リクエストを追加しました。pause

于 2012-03-22T16:21:45.363 に答える