6

サーバーからの残りの応答を停止するにはどうすればよいですか - たとえば。

http.get(requestOptions, function(response){

//Log the file size;
console.log('File Size:', response.headers['content-length']);

// Some code to download the remaining part of the response?

}).on('error', onError);

ファイルサイズをログに記録し、残りのファイルをダウンロードするために帯域幅を無駄にしたくないだけです。nodejs はこれを自動的に処理しますか、それとも特別なコードを書く必要がありますか?

4

2 に答える 2

13

ファイルのサイズを取得するだけの場合は、HTTP HEADを使用するのが最適です。これは、本文なしでサーバーからの応答ヘッダーのみを返します。

次のように、Node.js で HEAD リクエストを作成できます。

var http = require("http"),
    // make the request over HTTP HEAD
    // which will only return the headers
    requestOpts = {
    host: "www.google.com",
    port: 80,
    path: "/images/srpr/logo4w.png",
    method: "HEAD"
};

var request = http.request(requestOpts, function (response) {
    console.log("Response headers:", response.headers);
    console.log("File size:", response.headers["content-length"]);
});

request.on("error", function (err) {
    console.log(err);
});

// send the request
request.end();

編集:

私は、本質的に「Node.js で要求を早期に終了するにはどうすればよいですか?」というあなたの質問に実際には答えていないことに気付きました。response.destroy() を呼び出すことで、処理の途中でリクエストを終了できます。

var request = http.get("http://www.google.com/images/srpr/logo4w.png", function (response) {
    console.log("Response headers:", response.headers);

    // terminate request early by calling destroy()
    // this should only fire the data event only once before terminating
    response.destroy();

    response.on("data", function (chunk) {
        console.log("received data chunk:", chunk); 
    });
});

destroy() 呼び出しをコメントアウトし、完全なリクエストで 2 つのチャンクが返されることを確認することで、これをテストできます。ただし、他の場所で述べたように、単純に HTTP HEAD を使用する方が効率的です。

于 2013-04-24T14:33:40.093 に答える
3

get の代わりにHEADリクエストを実行する必要があります

この回答から取得

var http = require('http');
var options = {
    method: 'HEAD', 
    host: 'stackoverflow.com', 
    port: 80, 
    path: '/'
};
var req = http.request(options, function(res) {
    console.log(JSON.stringify(res.headers));
    var fileSize = res.headers['content-length']
    console.log(fileSize)
  }
);
req.end();
于 2013-04-24T14:33:27.270 に答える