【问题标题】:Why "queue closed error" occurs at when using archiver.file module to compress files为什么使用archiver.file模块压缩文件时出现“队列关闭错误”
【发布时间】:2019-03-06 19:51:31
【问题描述】:

我正在尝试使用归档器在 nodejs 中以 zip 格式下载多个文件。这是我的代码:

exports.downloadAllFiles = function(req,res){
    var archive = archiver('zip', {
        gzip: true,
        zlib: { level: 9 } // Sets the compression level.
    });
    var output = fs.createWriteStream( "/home/files/Downloads/demo.zip");

    archive.pipe(output);

    demoDb.findOne({ caseguid: req.params.id }, function(err, data) { 
        if (err) {
            res.json(HttpStatus.INTERNAL_SERVER_ERROR, {});
        } else {
            if(data){
                data.Files.forEach(function(singleDoc){
                       archive.append(fs.createReadStream(singleDoc.filePath), { name: singleDoc.fileName })

                })

            }

         }

    })
    archive.finalize();
};

这是错误堆栈:

{ Error: queue closed
    at Archiver.append (/home/node_modules/archiver/lib/core.js:552:24)
    at Promise.<anonymous> (/home/server/controllers/caseController.js:1722:25)
    at Promise.<anonymous> (/home/node_modules/mpromise/lib/promise.js:177:8)
    at emitOne (events.js:96:13)
    at Promise.emit (events.js:188:7)
    at Promise.emit (/home/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/home/node_modules/mpromise/lib/promise.js:97:20)
    at /home/node_modules/mongoose/lib/query.js:1406:13
    at model.Document.init (/home/node_modules/mongoose/lib/document.js:254:11)
    at completeOne (/home/node_modules/mongoose/lib/query.js:1404:10)
    at Immediate.cb (/home/node_modules/mongoose/lib/query.js:1158:11)
    at Immediate.<anonymous> (/homenode_modules/mquery/lib/utils.js:137:16)
    at runCallback (timers.js:672:20)
    at tryOnImmediate (timers.js:645:5)
    at processImmediate [as _immediateCallback] (timers.js:617:5) message: 'queue closed', code: 'QUEUECLOSED', data: undefined }

【问题讨论】:

  • Leonardo 的答案看起来是正确的,在archive.finalizearchive.append 旁边添加一些打印,您会看到首先调用了finalize,这不是您想要的。这是基本的 JS 异步行为,你应该先学习基础知识,这会让你的生活更轻松,网上有很多教程

标签: node.js


【解决方案1】:

可能在您的回调完成之前执行 archive.finalize() 行。尝试将您的 archive.finalize 移动到您的回调中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多