Node.js中使用fs.writeFile写入JSON键值对象时出现多余括号问题
Node.js中使用fs.writeFile写入JSON键值对象时出现多余括号问题
兄弟,我一眼就看出你代码里的核心问题了——你混用了async/await和回调函数,还连续发起了多次异步写文件操作,这些操作没有被正确等待和控制,导致多个写请求同时修改同一个文件,互相干扰,才会出现你看到的多余括号、内容拼接错乱的情况。
先拆解你代码里的几个坑:
- async/await和回调混用无效:你用了
await fs.readFile,但回调版的fs.readFile不会返回Promise,await在这里根本起不到等待作用,后面的清空、写文件操作都是并行执行的,完全没按顺序来。 - 重复且无意义的写操作:你先清空文件,然后连续两次写同一个
jsonData,这不仅多余,还会因为两次写操作是异步并行的,大概率会导致文件内容叠加或错乱。 - 错误被完全忽略:所有
err分支都空着,出现问题你根本不知道哪里出了错,调试起来特别困难。
给你重构后的正确代码
我们直接使用Node.js提供的fs.promises(Promise版的文件操作API),配合async/await就能完美解决异步控制的问题,代码也会简洁很多:
// 引入Promise版的fs模块,避免回调地狱 const fs = require('fs').promises; const path = require('path'); async function saveJsonFile(data, fileName = 'myFile') { try { // 拼接正确的文件路径,避免相对路径问题 const filePath = path.join(__dirname, `${fileName}.json`); // 将数据转为格式化的JSON字符串,方便阅读和调试 const jsonData = JSON.stringify(data, null, 2); // 直接写入文件:如果文件不存在会自动创建,存在则覆盖原有内容 await fs.writeFile(filePath, jsonData, 'utf8'); // 如果你之后需要用require读取这个文件,再清除缓存(不需要的话可以删掉这部分) const modulePath = require.resolve(filePath); if (require.cache[modulePath]) { delete require.cache[modulePath]; } console.log(`✅ 文件${fileName}.json已成功更新`); } catch (err) { console.error('❌ 写入文件出错:', err); throw err; // 抛出错误让调用者处理,避免静默失败 } }
然后是调用的地方,因为已经用await等待saveJsonFile完成,循环里的每次写操作都会按顺序执行,不会出现并行写入冲突:
async function runTrading() { try { // 注意这里i从0开始更合理,根据你的data结构调整 for (let i = 0; i < data.length; i++) { // ... 你的业务逻辑代码 lastBuyPrice[symbol] = currentPrice; // 等待文件写入完成后,再进入下一次循环 await saveJsonFile(lastBuyPrice); } } catch (err) { console.error('交易流程执行出错:', err); } }
为什么这样能解决问题?
- 异步操作被正确控制:
fs.promises.writeFile返回Promise,配合await能确保每次文件写入完成后,才进行下一次循环,彻底避免多个写操作同时修改文件的冲突。 - 去掉了多余操作:
fs.writeFile默认会覆盖整个文件内容,不需要先清空再写入,一步到位更高效。 - 错误被正确捕获:不再忽略错误,方便你定位问题。
备注:内容来源于stack exchange,提问作者Magor Menessy
相关产品推荐
相关产品推荐

