Node.js 上的多个 fs.writeFile

问题描述

直截了当,我在 Node.js 中运行一个 http 服务器来管理酒店的入住/退房信息,我使用“fs.writeFile”将内存中的所有 JSON 数据写入同一个文件。 数据通常不超过 145kB 最大值,但是由于我每次从我的数据库获得更新时都需要写入它们,因此当对 fs.writeFile 的调用立即一个一个发生时,我会出现数据丢失/错误的 JSON 格式。>

目前我已经使用“fs.writeFileSync”解决了这个问题,但是我想听听更复杂的解决方案,而不是使用同步功能的简单/错误解决方案。 使用 fs.promises 会导致同样的错误,因为我再次必须多次调用 fs.promises。 根据 Node 的文档,多次调用 fs.writefile 或 fs.promises 是不安全的,他们建议使用文件流,但目前这不是一个选项。

总而言之,在尝试任何重复写入操作之前,我需要等待 fs.writeFile 正常结束,并且使用回调没有用,因为我不知道何时需要完成写入操作。 预先非常感谢您

解决方法

我假设您的意思是在上次写入请求仍在写入时覆盖或截断文件。如果我是你,我会使用 promises API 并注意文档中的警告:

It is unsafe to use fsPromises.writeFile() multiple times on the same file without waiting for the promise to be settled.

您可以在传统循环中 await 结果,或者非常小心地使用 .then() 来“同步”您的回调,但是如果您在事件循环中除了从您的数据库并写入此文件,您不妨使用 writeFileSync 来保持简单/安全。异步 API(回调和承诺)旨在允许您的程序在此期间做其他事情;如果这不是必需的并且异步 API 为您的代码增加了麻烦的复杂性,只需使用同步 API。对于任何节点 API 或库函数都是如此,而不仅仅是 fs.writeFile

还有一些库可以为您执行原子文件系统操作并抽象出实现细节,但我认为除非您更详细地描述您的用例,否则这些库对您来说可能太过分了。例如,为什么要尽可能快/频繁地将数据库以 JSON 格式转储到磁盘,而不是将内容保存在内存中或使用基于事件的增量更新(例如,具有原子性和一致性保证的真实本地数据库)。

,

感谢您的回复! 由于我的应用程序主要是一个 http 服务器,是的,我会做其他事情而不是简单的输入/输出,尽管请求量并不大。我会再次查看 promises 解决方案,但第一次我没有运气。

为了解释更多,我有一个:function updateRoom(data){ ...update things in memory... writetoDisk(); } 和函数 writetoDisk(){ fsWriteFile(....) }

使函数 writetoDisk 成为异步函数并在其中实现“await”仍然不能解决问题,因为 updateRoom 函数将调用 writetoDisk 而不等待它结束。 “.then”方法无法实现,因为我的 updateRoom 不断被动态调用。

如果您碰巧知道关于 async-await 的 1-2 件事,欢迎您多解释一下,不过再次感谢!