2013-04-24 9 views
5

Come possiamo interrompere la risposta rimanente da un server - Ad es.Interrompe il download dei dati nella richiesta nodejs

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

Voglio solo registrare le dimensioni del file e non sprecare la mia larghezza di banda nel download del file rimanente. Nodejs gestisce automaticamente questo o devo scrivere un codice speciale per questo?

risposta

9

Se si desidera solo recuperare la dimensione del file, è meglio usare HTTP HEAD, che restituisce solo le intestazioni di risposta dal server senza il corpo.

È possibile effettuare una richiesta HEAD in Node.js come questo:

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:

mi sono reso conto che non ho davvero risponde alla tua domanda, che è essenzialmente "Come fare Chiudo anticipatamente una richiesta in Node.js? ". È possibile terminare qualsiasi richiesta nel bel mezzo della trasformazione chiamando 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); 
    }); 
}); 

è possibile verificare questa commentando la chiamata destroy() e osservando che in una richiesta completa di due pezzi vengono restituiti. Come accennato altrove, tuttavia, è più efficiente utilizzare semplicemente HEAD HTTP.

+0

Grazie, per la risposta. Com'è diverso da response.end() e quando dovrei usarlo? – Tushar

+0

Un'altra cosa, se non associo un ascoltatore all'evento 'dati', i dati saranno ancora trasferiti? Intendo che la mia larghezza di banda verrà inutilmente sprecata? – Tushar

+0

Sì, i dati verranno comunque inviati al client anche se non si gestisce l'evento "dati". –

3

È necessario eseguire un HEAD richiesta invece di un get

Tratto da 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

Grazie Noah, non ero a conoscenza di questo approccio. – Tushar

Problemi correlati