首页 文章

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

提问于
浏览
1

我正在尝试创建一个简单的应用程序,它将动态创建包含几个文件的ZIP并将它们传输到客户端 . 几乎是有效的 . 我遇到的问题是当流进行时nodejs阻塞 . 完成当前流式传输后,将处理所有pendig请求 . 但有趣的是, these pending requests will be processed concurrently! 所以它可以做到这一点!我不会在流式传输一个文件时开始处理下一个请求以及我做错了什么......:|

我正在使用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 . 也许这是一个问题?有任何想法吗?

2 回答

  • 0

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

  • 1

    似乎 Archiver 依赖于同步代码,最近在github上打开了一个问题来解决这个问题:

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

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

    引用:

    这个模块依赖于文件实用程序,它在README中说:“这是一组同步实用程序 . 因此,它永远不应该在Node.js服务器上使用 . 这适用于用户/命令行实用程序 . ”

相关问题