2016-04-06 4 views
1

Ich habe ein seltsames Problem. Ich verwende eine Anfrage für den Datei-Download in NodeJs und jedes Mal, wenn ich größere Dateien (> 250 MB) herunterlade, werden sie in den Speicher heruntergeladen und nicht direkt zum Dateisystem gestreamt. Vielleicht mache ich etwas falsch, aber ich habe einen Testfall erstellt und die Datei wird immer noch nicht gestreamt.NodeJs streaming Datei von Anfrage an Dateisystem nicht Speicher

var request = require('request'); 
var fs = require('fs'); 
    var writable = fs.createWriteStream("1GB.zip"); 
    var stream = request.get({ 
     uri: "http://ipv4.download.thinkbroadband.com/1GB.zip", 
     encoding: null 
    }, function(error, response, body) { 
     console.log("code:", response.statusCode); 
     if (response.statusCode >= 500) { 
      log.err(response.statusCode, " Servererror", file.url); 
     } 
    }).pipe(writable); 

in diesem Testfall i`m eine Probe 1 GB Datei herunterzuladen, und wenn Sie den Knoten proccess mit dem Taskmanager beobachten wächst es auf> 1 GB, da es die Datei herunterlädt. Ich möchte, dass meine Knoten Anwendung verwendet nicht mehr als 200 MB Ram

+0

helfen könnten: http://stackoverflow.com/a/19708936/5388620 – Shanoor

Antwort

2

Das Problem ist, dass Sie einen Rückruf vorbei sind, die implizit Pufferung innerhalb request ermöglicht, weil einer der Parameter für den Rückruf die gesamte body der Antwort .

Wenn Sie wollen wissen, wann die response verfügbar ist, hören nur für die response Ereignis statt:

var request = require('request'); 
var fs = require('fs'); 
var writable = fs.createWriteStream("1GB.zip"); 
var stream = request.get({ 
    uri: "http://ipv4.download.thinkbroadband.com/1GB.zip", 
    encoding: null 
}).on('response', function(response) { 
    console.log("code:", response.statusCode); 
    if (response.statusCode >= 500) { 
    log.err(response.statusCode, " Servererror", file.url); 
    } 
}).pipe(writable);