如何使用nodejs将数组obj写入文件

时间:2016-11-23 17:18:38

标签: node.js writefile

我正在尝试使用下面的代码,我可以在服务器上写文件,文件包含内容但是,当我下载文件时,它是空白的。

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.

如何下​​载包含所有内容的文件?

2 个答案:

答案 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操作时使用回调或寻找完成/结束事件。