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

标签 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)

最佳答案

您的服务器不会崩溃,因为您正在请求如此大的文件或保存它们,而是因为您这样做了:

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

这样,只有少数 block 保留在 RAM 中,并且在写入硬盘后将被删除。

关于javascript - 如何处理 Node.js 中大文件的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285119/

相关文章:

javascript - 如何使 ondblclick 事件在手机上起作用?

javascript - 获取 td 父级和 tr 子级

JavaScript:如何防止 "undefined"定义困惑?

javascript - Node 生成子进程在 aws Node 10 lambda 中的 exec 子进程之后不执行命令

javascript - 使用 Twilio Node 模块接收文本消息并用文本消息响应

node.js - 将证书凭据与 msal-node 结合使用

node.js - 为什么我的控制台记录 : `TimeoutOverflowWarning: 4294967296000 does not fit into a 32-bit signed integer`

javascript - 读取错误处理程序中.myStyle的 'background-image'属性值并将其设置为src?

javascript - NodeJS 从基于自定义模块的匿名函数获取对象

node.js - Nodejs从另一个文件访问函数