我在 raspbian 上运行 node.js 并尝试使用以下代码每 2/3 秒保存/更新一个文件:
var saveFileSaving = false;
function loop() {
mainLoop = setTimeout(function() {
// update data
saveSaveFile(data, function() {
//console.log("Saved data to file");
loop();
});
}, 1500);
}
function saveSaveFile(data, callback) {
if(!saveFileSaving) {
saveFileSaving = true;
var wstream = fs.createWriteStream(path.join(__dirname, 'save.json'));
wstream.on('finish', function () {
saveFileSaving = false;
callback(data);
});
wstream.on('error', function (error) {
console.log(error);
saveFileSaving = false;
wstream.end();
callback(null);
});
wstream.write(JSON.stringify(data));
wstream.end();
} else {
callback(null);
}
}
当我运行它时,它可以正常工作一个小时,然后开始吐出:
[25/May/2016 11:3:4 am] { [Error: EROFS, open '<path to file>']
errno: 56,
code: 'EROFS',
path: '<path to file>' }
我试过 jsonfile 插件,它也会在一小时后发出类似的写入错误。
我试过 fileSystem.writeFile 和 fileSystem.writeFileSync 都在一个小时后给出相同的错误。
我认为这与处理程序在新的保存发生之前没有被释放有关,这就是我开始使用saveFileSaving标志的原因。
通过硬重置重置系统解决了这个问题(软重置不起作用,因为系统似乎被锁定了)。
有什么建议吗?我在网上搜索过,所以只发现了一个与 4 年前略有相似的另一个问题,它被搁置了。
注意:我正在使用代码中的回调函数来继续主循环。