Node.js中JSON.stringify序列化对象存文件随机出现格式错误问题
问题原因分析
- 并行异步写入冲突
你使用的fs.writeFile是异步非阻塞接口,当短时间内连续创建多个User实例时,会同时触发多次save调用,多个异步写入任务会并行执行。由于操作系统层面的普通文件写入不是原子操作,多个写入流同时向同一个文件写入内容时,会出现内容穿插、互相覆盖的情况,最终生成格式错误的JSON。 - 进程重启打断写入
你用到了nodemon自动重启服务,如果触发重启的时间点恰好有一次fs.writeFile还未执行完成,进程会被强制终止,写到一半的不完整内容就会留存到users.json文件中,导致JSON格式异常。 - 序列化过程中对象被修改
JSON.stringify序列化User.USERS的过程是同步遍历对象属性,如果遍历过程中刚好有新的用户被添加到User.USERS中,也有极低概率导致序列化产出的字符串格式异常。
学习场景临时解决方案
如果不需要生产级稳定性,可以优先修改写入逻辑避免并行写入:
把异步写入改为同步写入,保证同一时间只有一个写入任务执行:
function save() { fs.writeFileSync('save_info/users.json', JSON.stringify(User.USERS)); }
也可以给save函数加防抖逻辑,避免短时间内重复触发写入。
内容的提问来源于stack exchange,提问作者CollidaCube
相关产品推荐
相关产品推荐

