Nodejs 在 ZIP 文件流式传输期间阻塞并且无法处理下一个请求



我试图创建一个简单的应用程序,它将创建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上打开了一个问题来解决这个问题:

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

考虑到它是同步的,这可能就是你的块来自哪里。

:

这个模块依赖于file-utils,它在README中说:"这是一个一组同步实用程序。因此,它不应该用于node . js服务器。这是针对用户/命令行实用程序的。"

相关内容

  • 没有找到相关文章