如果在写入期间设备关闭,则node.js防止文件损坏

时间:2019-10-04 13:04:08

标签: node.js linux

我们将在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成功后用临时文件替换原始配置文件,但我认为在以下情况下也会受到这种情况的影响:

  1. config.temp得到了
  2. config.json get重命名为config.bak,因此config.temp可以重命名
  3. 发生断电,config.json不再起作用,因为它已重命名为config.bak,并且尚未重命名为config.temp,因此没有可用的配置文件

我知道我可以重命名,也可以从备份文件中提取配置,但是我不喜欢这种想法,除非这是唯一的方法。

0 个答案:

没有答案