无法下载动态创建的ZIP存档

时间:2018-10-15 15:47:09

标签: javascript node.js express asynchronous archiverjs

我正在尝试将MySQL查询的输出动态写入存档。这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        Vector v = new Vector { 1, 2, 3 };
        Vector squares = Pow(v, 2);

        // Squares now contains [1, 4, 9]
    }
}

该代码应使用多个文本文件创建一个zip存档。必须向访问var async = require("async"); var mysql = require("mysql"); var express = require("express"); var archiver = require("archiver"); var app = express(); var connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'password', database : 'test' }); app.get('/file', (req, res) => { res.writeHead(200, { 'Content-Type': 'application/zip', 'Content-disposition': 'attachment; filename=archive-name.zip' var zip = archiver('zip', { zlib: { level: 9 } }); zip.pipe(res); zip.on('end', function() { console.log('Archive wrote %d bytes', zip.pointer()); }); const queriesArray = ["SELECT * FROM tb1", "SELECT * FROM tb2"]; async.forEachOf(queriesList, (query) => { connection.query(query, (err, results) => { if(!err) { zip.append(JSON.stringify(results), {name: `${query}.txt`}) } else { console.log("Error while performing Query"); } }) }, function(err) { if (err) { console.log("error") } else { zip.finalize(); } }) }) const port = process.env.PORT || 7000; app.listen(port, () => { console.log('Listen on port ' + port); }) 页面的用户显示文件下载提示,但是/file似乎无法正常工作,因此我无法下载创建的存档(当我访问{{1}时开始下载},但尚未完成)。为什么我的代码不起作用?

1 个答案:

答案 0 :(得分:1)

这是因为从未调用您的回调函数,因为forEachOf不知道它已经完成了所有异步任务。

iteratee函数有一个最后一个参数,它是一个回调函数,您必须调用该函数才能使它知道特定的异步过程已完成,但您永远不会使用它。

  

https://caolan.github.io/async/global.html#AsyncFunction

     

Async上下文中的“异步函数”是异步的   函数具有可变数量的参数,最后   参数是回调。 (function (arg1, arg2, ..., callback) {})   最终的回调格式为callback(err, results...)其中   函数完成后必须调用它。

因此,要修复代码,请确保在查询调用的回调内调用iteratee函数的回调方法

async.forEachOf(queriesList, (query,key,callback) => {
    connection.query(query, (err, results) => {
        if(!err) {
            zip.append(JSON.stringify(results), {name: `${query}.txt`})
        }
        else {
            console.log("Error while performing Query");
        }
        callback();
    })