Node.js上有多个fs.writeFile



直截了当地说,我在Node.js中运行一个http服务器,管理酒店的入住/退房信息,在这里我使用"fs.writeFile";。数据通常不超过145kB的最大值,然而,由于每次从数据库获得更新时我都需要写入它们,因此当对fs.writeFile的调用一个接一个地立即发生时,我会出现数据丢失/JSON格式错误。

目前,我已经使用";fs.writeFileSync";然而,我希望听到一个更复杂的解决方案,而不是使用同步功能的简单/糟糕的解决方案。使用fs.promices会导致相同的错误,因为我不得不再次多次调用fs.promimes。根据Node的文档,多次调用fs.writefile或fs.promices是不安全的,他们建议使用文件流,但目前这不是一个选项。

总之,在尝试任何重复的写入操作之前,我需要等待fs.writeFile正常结束,使用回调是没有用的,因为我不知道什么时候需要执行写入操作。提前非常感谢

我认为您的意思是在写最后一个写请求时覆盖或截断文件。如果我是你,我会使用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(回调和Promises(旨在允许您的程序在此期间做其他事情;如果这不是必要的,并且异步API会给代码增加麻烦的复杂性,那么只需使用同步API即可。对于任何节点API或库函数都是如此,而不仅仅是fs.writeFile

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

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

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

使函数writetoDisk成为异步函数;等待";在内部,它仍然不能解决问题,因为updateRoom函数将调用writetoDisk而不等待它结束。";。那么";方法无法实现,因为我的updateRoom被不断动态地调用。

如果你碰巧知道关于异步等待的1-2件事,非常欢迎你再给我解释一下,不过再次感谢!

最新更新