我正在尝试使用下面的代码,我可以在服务器上写文件,文件包含内容但是,当我下载文件时,它是空白的。
var file = fs.createWriteStream('./tmp/text.txt');
file.on('error', function(err) { console.log(err) });
rows.forEach(function(v) {
file.write(v + "\r\n");
productExport.DeleteProduct(v.ProductId, function(err){
if(err) throw err;
});
});
file.end();
var file = "./tmp/text.txt";
res.download(file); // Set disposition and send it.
如何下载包含所有内容的文件?
答案 0 :(得分:2)
您的代码的结构方式对于您尝试执行的操作不正确。首先,您的问题是您在写入文件流之前使用res.download()
进行响应。此外,您在同一范围内对var file
进行了两次初始化,这也不正确。
var file = "./tmp/text.txt";
var writeStream = fs.createWriteStream(file);
writeStream.on('error', err => console.log );
writeStream.on('finish', () => {
return res.download(file); // Set disposition and send it.
});
rows.forEach((v) => {
writeStream.write(v + "\r\n");
productExport.DeleteProduct(v.ProductId, function(err){
if(err) throw err;
});
});
writeStream.end();
如果您对此感到困惑,并且可能是异步处理,this is the defacto answer on SO用于理解Node.js中的异步
答案 1 :(得分:1)
通过I / O将数据写入文件是一种异步操作。您必须等待WriteStream完成才能下载文件。
var file = fs.createWriteStream('./tmp/text.txt');
file.on('error', function(err) { console.log(err) });
rows.forEach(function(v) {
file.write(v + "\r\n");
productExport.DeleteProduct(v.ProductId, function(err){
if(err) throw err;
});
});
file.end();
file.on('finish', function() {
var file = "./tmp/text.txt";
res.download(file); // Set disposition and send it.
});
额外信息:
FileSystem#createWriteStream返回WriteStream对象。 从WriteStream它的统计数据来看,有6个事件[关闭,排水,错误,完成,管道,管道]。
在node.js世界中,你总是希望在有I / O操作时使用回调或寻找完成/结束事件。