我正在尝试将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}时开始下载},但尚未完成)。为什么我的代码不起作用?
答案 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();
})