Node.js文件写入循环失败,随机失败

这是我的代码:

function aCallbackInLoop(dataArray) { dataArray.forEach(function (item, index) { fs.appendFile(fileName, JSON.stringify(item) + "\r\n", function (err) { if (err) { console.log('Error writing data ' + err); } else { console.log('Data written'); } }); }); } 

我得到随机错误:

 Data written Data written . . Error writing data Error: UNKNOWN, open 'output/mydata.json' Error writing data Error: UNKNOWN, open 'output/mydata.json' . . Data written Error writing data Error: UNKNOWN, open 'output/mydata.json' 

函数(aCallbackInLoop)是一个Web服务请求的callback,它返回dataArray中的数据块。 多个Web服务请求正在循环中,所以这个callback可能被并行调用。 我怀疑这是一些文件locking问题,但我不知道如何解决。

PS:我已经确定这不是一个数据问题(我loggingdataArray中的所有项目)

编辑:尝试写入stream后的代码:

 function writeDataToFile(fileName, data) { try { var wStream = fs.createWriteStream(fileName); wStream.write(JSON.stringify(data) + "\r\n"); wStream.end(); } catch (err) { console.log(err.message); } } function aCallbackInLoop(dataArray){ dataArray.forEach(function(item, index){ writeDataToFile(filename, item); //filename is global var }); } 

正如你所看到的,由于前面的appendFile调用,多个appendFile调用无法继续。 在这种情况下,创build一个写入stream将会更好。

 var wstream = fs.createWriteStream(fileName); dataArray.forEach(function (item) { wstream.write(JSON.stringify(item + "\r\n"); }); wstream.end(); 

如果你想知道什么时候所有的数据都被写入了,那么你可以使用finish事件注册一个函数,像这样

 var wstream = fs.createWriteStream(fileName); wstream.on("finish", function() { // Writing to the file is actually complete. }); dataArray.forEach(function (item) { wstream.write(JSON.stringify(item + "\r\n"); }); wstream.end();