如何处理Node.js中大文件的响应?

时间:2018-03-14 18:21:58

标签: javascript node.js

我正在处理一个大文件,我正在发出一个HTTP请求来获取数据。响应通过流

传输
fs.createReadStream(pathToFile).pipe(res)

我的请求功能如下所示

function makeRequest(requestData, IP) {
    var options = {
        host: IP,
        port: 5000,
        path: '/read',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    var req = http.request(options, function(res) {
        //res.setEncoding('binary');
        var data = [];
        res.on('data', function(chunk) {
            data.push(chunk);
        });

        res.on('end', function() {
            //fs.appendFileSync(fileName, data);
            var binary = Buffer.concat(data);
            var writeStream = fs.createWriteStream(fileName, { "flags": 'a' });
            writeStream.write(binary);
            writeStream.end();
        });

        res.on('error', function(err){
            console.log("Error during HTTP request");
            console.log(err.message);
        });
    });

    req.write(requestData);
    req.end();
}

我相信由于它的数据量如此之大,它会影响内存,而服务器只会崩溃。我该怎么处理这个?

这个问题是基于另一个问题,我曾经问过 (Reading large files in Node.js from another server

1 个答案:

答案 0 :(得分:1)

您的服务器不会崩溃,因为您要求这样大的文件或保存它们,而是因为您这样做:

 var data = [];

您将整个1GB(或文件的大小)缓存到RAM中!并以一种非常消耗内存的方式(为什么不是缓冲区?)。相反,您应该将数据直接写入文件,不要缓存它:

  var writeStream = fs.createWriteStream(fileName, { "flags": 'a' });

   res.on('data', function(chunk) {
        writeStream.write(chunk);
    });

    res.on('end', function() {
        writeStream.end();
    });

实际上可以简化为:

 res.pipe(fs.createWriteStream(fileName, { "flags": 'a' }))

通过只有几个块保留在RAM中,并且在写入硬盘后将被删除。