我试图创建一个简单的应用程序,它将创建ZIP在飞行中包含几个文件,并流式传输到客户端。几乎是有效的。我遇到的问题是,当流式传输正在进行时,nodejs阻塞。所有未完成的请求将在完成当前流处理后处理。但有趣的是,这些挂起的请求将被并发处理!所以它可以这样做!我不明白,为什么nodejs (expressjs?)不能开始处理下一个请求期间流式传输一个文件和我做错了什么…: |
我使用node-archiver作为流源。
这是我的部分代码:
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;
有什么建议吗?谢谢!
编辑:我注意到另一个问题,完全与归档器无关。我有以下基本的应用程序:
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);
告诉我,为什么它会卡在这个箱子里?结果与使用归档器完全相同。我使用的操作系统是SmartOS(基于Open Solaris),是Unix。也许这是个问题?什么好主意吗?
对于所有有类似问题的人。也许是我太笨了。解决办法很简单。基本上测试方法是错误的。我的浏览器(和其他测试有类似的行为)阻止处理下一个请求从相同的主机名时,前一个还没有完成。在这种情况下,这是未完成的请求,因为下载仍在进行中。谢谢你的帮助!
似乎Archiver
依赖于同步代码,最近在github上打开了一个问题来解决这个问题:
考虑到它是同步的,这可能就是你的块来自哪里。
:
这个模块依赖于file-utils,它在README中说:"这是一个一组同步实用程序。因此,它不应该用于node . js服务器。这是针对用户/命令行实用程序的。"