从node.js中的管道传输大数据时截断

时间:2014-11-11 15:43:48

标签: node.js

我正在尝试使用节点从子进程通过HTTP传输任意大量的数据。我的完整代码是here,突出的位是:

  res.writeHead(200, {
    'Content-Type': 'application/octet-stream',
    'Content-Disposition': 'attachment;filename=osm_export_' +
      ((north + south) / 2) + '_' + ((east + west) / 2) + '.pbf'
    });

  // run vex
  var proc = spawn(cmd, [dbname, south, west, north, east, '-']);

  // stream chunks
  proc.stdout.pipe(res);

在大约40 MB(40,000,000到42,000,000字节之间)之后,流被中断并且请求永远不会完成。我无法设置Content-Length标头,因为我不知道命令将产生多少数据,直到完成我想知道这是否是缓冲区欠载;有问题的命令是从数据库中提取数据并编写流,这可能比我的计算机和服务器之间的连接慢。我怀疑这是因为我用这个替换了代码:

var http = require('http');
var spawn = require('child_process').spawn;

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'application/octet-stream'});

  var proc = spawn('head', ['-c', '500000000', '/dev/zero']);

  proc.stdout.pipe(res);
}).listen(8181, '127.0.0.1');

传输500MB的空数据,并且运行正常。我需要设置某种超时等等吗?

2 个答案:

答案 0 :(得分:2)

啊,发现了这个问题。这可能对其他人有用,也可能没用。我没有对进程stderr进行任何操作,后端进程将大量状态信息写入stderr。某个节点内部的缓冲区正在填满,然后崩溃了。将流程创建行更改为

  var proc = spawn(cmd, [dbname, south, west, north, east, '-'], {stdio: ['ignore', 'pipe', 'ignore']});

解决了这个问题。感谢所有帮助过的人!

答案 1 :(得分:0)

尝试设置HTTP标头Content-Length并将其值设置为您在响应中使用的数据大小。