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
的同步版本 – https://nodejs.org/api/fs.html#fs_fs_appendfilesync_filename_data_options
正如你所看到的,由于前面的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();