我正在尝试使用节点从子进程通过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的空数据,并且运行正常。我需要设置某种超时等等吗?
答案 0 :(得分:2)
stderr
进行任何操作,后端进程将大量状态信息写入stderr。某个节点内部的缓冲区正在填满,然后崩溃了。将流程创建行更改为
var proc = spawn(cmd, [dbname, south, west, north, east, '-'], {stdio: ['ignore', 'pipe', 'ignore']});
解决了这个问题。感谢所有帮助过的人!
答案 1 :(得分:0)
尝试设置HTTP标头Content-Length
并将其值设置为您在响应中使用的数据大小。