在ZIP文件stream式传输过程中,Nodejs阻止并不能处理下一个请求

我试图创build一个简单的应用程序,将创buildZIP包含几个文件并将它们stream到客户端。 几乎工作。 我遇到的问题是nodejs在进行stream传输时阻塞。 所有pendig请求将在完成当前stream式处理后处理。 但有趣的是, 这些待处理的请求将被同时处理! 所以它可以做到这一点! 我不明白,为什么nodejs(expressjs?)在stream式传输一个文件的时候无法开始处理下一个请求,我做了什么错误…:

我正在使用node-archiver作为stream源。

这是我的部分代码:

var express = require('express'); var archiver = require('archiver'); var router = express.Router(); router.get('/job/:id', function(req, res) { var job = req.jobs[req.params.id]; var archive = archiver('zip'); archive.pipe(res); for (var n in job.files) { var f = job.files[n]; archive.file(job.path + f, {name: f}); } res.setHeader("content-type", "application/zip"); res.setHeader("Content-Disposition", 'attachment; filename="reports.zip"') archive.finalize(); }); module.exports = router; 

任何build议? 谢谢!

编辑:我注意到另一个问题,完全没有与归档的相关。 我有以下基本的应用程序:

 var http = require('http'); var fs = require('fs'); var server = http.createServer(function (req, res) { var stream = fs.createReadStream('file.blob'); stream.pipe(res); }); server.listen(31922); 

告诉我,为什么在这种情况下卡住了? 结果与使用归档程序完全相同。 OS使用的是SmartOS(基于Open Solaris),它是Unix。 也许这是一个问题? 有任何想法吗?

对于所有那些在类似问题上挣扎的人。 我也许是愚蠢的。 解决scheme很简单。 基本testing方法是错误的。 我的浏览器(和其他testing有类似的行为)阻止处理来自同一个主机名的下一个请求,当前一个没有完成。 而在这种情况下,这还没有完成请求,因为下载仍在进行中。 谢谢你的帮助!

看来Archiver依赖于同步代码,最近在github上打开了这个问题:

https://github.com/ctalkington/node-archiver/issues/85

鉴于它是同步的,这可能是你的块来自的地方。

引用:

这个模块依赖于自述文件中的file-utils:“这是一组同步实用程序,所以它不应该在Node.js服务器上使用,这是为了用户/命令行实用程序。