2013-04-24 5 views
5

Wie können wir die verbleibende Antwort von einem Server stoppen - Für z.Stoppen Herunterladen der Daten in Nodejs Anfrage

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); 

Ich möchte nur die Dateigröße protokollieren und nicht meine Bandbreite beim Herunterladen der restlichen Datei verschwenden. Behandelt Nodejs das automatisch oder muss ich dafür einen speziellen Code schreiben?

Antwort

9

Genommen erhalten auszuführen Wenn Sie nur die Größe der Datei abrufen möchten, ist es am besten HTTP HEAD zu verwenden, die Gibt nur die Antwortheader vom Server ohne den Text zurück.

Sie können eine HEAD-Anfrage in Node.js wie diese machen:

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(); 

EDIT:

Ich erkannte, dass ich nicht wirklich Ihre Frage beantworten, die im Wesentlichen „Wie Ich beende eine Anfrage frühzeitig in Node.js? ". Sie können durch den Aufruf response.destroy() jede Anforderung in der Mitte der Verarbeitung beenden:

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); 
    }); 
}); 

Sie dies durch Auskommen testen die die destroy() Aufruf und die Beobachtung, dass in einer vollständigen Anforderung zwei Stücke zurückgegeben werden. Wie bereits an anderer Stelle erwähnt, ist es jedoch effizienter, einfach HTTP HEAD zu verwenden.

+0

Danke, für die Antwort. Wie ist das anders als response.end() und wann sollte ich das verwenden? – Tushar

+0

Noch eine Sache, wenn ich einen Listener nicht an das Ereignis "Daten" binde, werden die Daten noch übertragen? Ich meine meine Bandbreite wird unnötigerweise verschwendet werden? – Tushar

+0

Ja, die Daten werden weiterhin an den Client gesendet, auch wenn Sie das Ereignis "data" nicht verarbeiten. –

3

Sie benötigen einen HEAD Anfrage anstelle einer

von this answer

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(); 
+0

Dank Noah, mir war dieser Ansatz nicht bekannt. – Tushar