Node.js Nodejs块和can';t在压缩文件流期间处理下一个请求
我正在尝试创建一个简单的应用程序,它将动态创建包含一些文件的ZIP,并将它们流式传输到客户端。几乎奏效了。我遇到的问题是,当正在进行流传输时,nodejs会阻塞。所有pendig请求将在完成当前流式处理后处理。但有趣的是,这些挂起的请求将同时处理所以它可以这样做!我不明白,为什么nodejs(expressjs?)在流式传输一个文件时不能开始处理下一个请求,我做错了什么…: 我使用node archiver作为流源 以下是我的部分代码:Node.js Nodejs块和can';t在压缩文件流期间处理下一个请求,node.js,express,stream,Node.js,Express,Stream,我正在尝试创建一个简单的应用程序,它将动态创建包含一些文件的ZIP,并将它们流式传输到客户端。几乎奏效了。我遇到的问题是,当正在进行流传输时,nodejs会阻塞。所有pendig请求将在完成当前流式处理后处理。但有趣的是,这些挂起的请求将同时处理所以它可以这样做!我不明白,为什么nodejs(expressjs?)在流式传输一个文件时不能开始处理下一个请求,我做错了什么…: 我使用node archiver作为流源 以下是我的部分代码: var express = require('expres
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;
有什么建议吗?谢谢
编辑:我注意到另一个问题,完全与archiver无关。我有以下基本应用程序:
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);
告诉我,为什么它会卡在这个案子里?结果与使用archiver完全相同。我使用的操作系统是SmartOS(基于开放式Solaris),它是Unix。也许这是个问题?有什么想法吗?似乎
Archiver
依赖于同步代码,github最近有一个问题需要解决:
考虑到它是同步的,这可能就是你的块的来源
引述:
该模块依赖于自述文件中所述的文件UTIL:“这是一个
同步实用程序集。因此,不应在
Node.js服务器。这适用于用户/命令行实用程序。“
对于你们所有正在为类似问题挣扎的人。我可能是在装傻。解决办法很简单。基本上测试方法是错误的。我的浏览器(和其他被测试的浏览器有类似的行为)在上一个请求未完成时阻止处理来自同一主机名的下一个请求。在这种情况下,由于下载仍在进行中,所以请求尚未完成。谢谢你的帮助 尝试
archive.append(fs.createReadStream(job.path+f),{name:f})
看看会发生什么。@Kekas,恐怕这会卡在代码的不同部分。我试图通过var file=fs.createReadStream('file.blob')来流式传输一个简单的文件;文件管道(res)代码>结果完全相同!:|所以这不是archiver的问题。当我发现有趣的东西时,我会告诉你的。