【问题标题】:NodeJs streaming File from request to Filesystem not MemoryNodeJs 将文件从请求流式传输到文件系统而不是内存
【发布时间】:2016-07-26 19:24:25
【问题描述】:

我有一个奇怪的问题。我在NodeJs中使用文件下载请求,每次我下载较大的文件(> 250mb)时,它们都会被下载到内存中并且不会直接流式传输到文件系统。也许我做错了什么,但我做了一个测试用例,文件仍然没有被流式传输。

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

在这个测试用例中,我正在下载一个 1GB 的示例文件,如果您使用任务管理器观察节点进程,它会在下载文件时增长到 >1GB。 我希望我的 Node 应用程序使用不超过 200mb 的内存

【问题讨论】:

标签: javascript node.js request


【解决方案1】:

问题是您正在传递一个回调,它隐式启用在 request 内的缓冲,因为回调的参数之一是响应的整个 body

如果您想知道response 何时可用,只需监听response 事件即可:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多