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

how to write array obj into file with nodejs

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

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.

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

通过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 return WriteStream 对象。 从 WriteStream 的文档中统计有 6 个事件 [close, drain, error, finish, pipe, unpipe]。

在 node.js 世界中,当有 I/O 操作时,您应该始终期望使用回调或寻找 complete/finish 事件。

您的代码结构方式不适合您要执行的操作。首先,您的问题是您在文件流写入完成之前用 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

中的异步