这是我的代码:
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服务请求的回调,它返回dataArray中的数据块。在循环中正在进行多个Web服务请求,因此可能并行调用此回调。我怀疑这是一些文件锁定问题,但我不确定如何解决。
PS:我确定这不是数据问题(我正在记录dataArray中的所有项目)
编辑:尝试写入流后的代码:
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
});
}
答案 0 :(得分:7)
正如您所观察到的,由于之前的appendFile
次呼叫,多次appendFile
次呼叫无法继续。在这种特殊情况下,最好创建一个write 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();
答案 1 :(得分:2)
尝试使用同步版appendFile
- https://nodejs.org/api/fs.html#fs_fs_appendfilesync_filename_data_options