我们将在Linux上运行的node.js应用程序的配置存储在config.json文件中,该文件在加载应用程序时进行了解析。 这是一个非常重要的文件,因为它告诉应用程序应连接到哪个服务器。 该配置还包含其他一些信息。在一种情况下,当应用程序从服务器下载远程文件时,它将在下载完成时将上次同步时间写入该配置文件。 为此,我们在config类中只有一个简单的辅助函数:
set(k, val) {
config[k] = val; // update run-time config
log('Setting "' + k + '" with value "' + val + '"', 'config');
return new Promise(function (resolve, reject) {
try {
var jsonConfig = JSON.stringify(config); // stringify current config
} catch (e) {
reject(e);
return void (0); // prevent writing corrupted JSON to the file
}
require('fs').writeFile(configFile, jsonConfig, 'utf8', function (err) {
if (err) {
reject(err);
} else {
resolve(config);
}
});
});
}
曾经发生过一种情况,即在写入配置文件时设备的电源被切断,这导致文件在磁盘上的大小为0字节。这使我们的应用无法使用,因为它失去了所有配置。
我们不能使用文件以外的任何东西,因为我们运行在性能低下的设备上,我们也不想增加任何复杂性,例如数据库等。
有什么办法可以防止这样的写损坏? 我考虑过每次写入一个临时文件,并在.writeFile成功后用临时文件替换原始配置文件,但我认为在以下情况下也会受到这种情况的影响:
我知道我可以重命名,也可以从备份文件中提取配置,但是我不喜欢这种想法,除非这是唯一的方法。