使用NodeJS从url下载大文件时,服务器崩溃

我试图从nodejs使用请求模块从url(需要login)下载一个文件(+ 200mb),但是当它完成下载时,服务器开始减速,直到崩溃或变得非常慢。

这是我目前的代码(它下载整个文件,但我的服务器最终崩溃):

//Required modules var http = require('http'), url = require("url"), fs = require('fs'), request = require('request'), path = require("path"), events = require("events"), j = request.jar(), request = request.defaults({ jar : j }); // make te request login in with cookies console.log("downloading file :)"); request({ url:"http://example.com/", method:"POST", form:{u: "username",p: "password"} }, function(error,response,body){ setTimeout(function(){ request .get('http://example.com/test.ashx?file=15') .on('error', function(err) { console.log(err); }) .pipe(fs.createWriteStream("/var/www/filesDir/CustomName.zip")); console.log(body); },1000) } ); 

我已经尝试从这个答案申请另一个解决scheme,但由于某种原因,该文件没有被正确下载,它只会显示“下载进度:0字节”可能是与login访问相关的东西。

在这里,我把我试图从最后一句实现的其他代码

 var http = require('http'); var fs = require('fs'); var url = require("url"); var request = require('request'); var path = require("path"); var events = require("events"); var j = request.jar(); var request = request.defaults({ jar : j }); request({ url:"http://example.com/", method:"POST", form:{u:"username",p:"password"} }, function(error,response,body){ var downloadfile = "http://example.com/test.ashx?file=15"; var host = url.parse(downloadfile).hostname; var filename = "1977.zip"; var req = http.request({port: 80, host: host, method: 'GET'}); console.log("Downloading file: " + filename); console.log("Before download request"); req.end(); dlprogress = 0; setInterval(function () { console.log("Download progress: " + dlprogress + " bytes"); }, 1000); req.addListener('response', function (response) { var downloadfile = fs.createWriteStream(filename, {'flags': 'a'}); console.log("File size " + filename + ": " + response.headers['content-length'] + " bytes."); response.addListener('data', function (chunk) { dlprogress += chunk.length; downloadfile.write(chunk, encoding='binary'); }); response.addListener("end", function() { downloadfile.end(); console.log("Finished downloading " + filename); }); }); } ); 

你决定帮助我的方式并不重要。

我结束了这样做,我testing了多次代码,服务器没有崩溃了:

 var request = require('request'); var filed = require('filed'); var j = request.jar(); var request = request.defaults({ jar : j }); // make the request and login request({ url: "http://example.com/login", method:"POST", // 'u' and 'p' are the field names on the form form:{u:"username",p:"password"} }, function(error,response,body){ setTimeout(function(){ var downloadURL = 'http://example.com/download/file.zip'; var downloadPath = "/path/to/download/localNameForFile.zip"; var downloadFile = filed(downloadPath); var r = request(downloadURL).pipe(downloadFile); r.on('data', function(data) { console.log('binary data received'); }); downloadFile.on('end', function () { console.log(downloadPath, 'file downloaded to path'); }); downloadFile.on('error', function (err) { console.log(err, 'error downloading file'); }); },3000) } );