如何向JSON文件插入多条账户记录避免覆盖?现有代码求助
解决JSON文件追加账户记录不覆盖的问题
要实现多次插入账户且保留旧数据,核心是把原来的单个对象结构改成数组结构存储多条记录,同时修改读写逻辑为先读再写。具体调整如下:
1. 修正writeFile的异步逻辑
原函数声明了async却用回调式fs.writeFile,改成基于fs.promises的异步写法,避免回调嵌套:
async writeFile(path, content) { try { await fs.promises.writeFile(path, content, 'utf8'); // 可选:验证写入结果 const savedData = await fs.promises.readFile(path, 'utf8'); console.log(savedData); } catch (err) { console.error('写入文件出错:', err); } }
2. 修改insertAccountToFile实现追加逻辑
步骤:读取现有文件→解析为数组→添加新账户→重新写入文件:
import fs from 'fs/promises'; // 确保引入promise版本的fs export async function insertAccountToFile(path, emailAcc, orgName) { let accountList = []; // 读取并解析现有文件 try { const existingContent = await fs.readFile(path, 'utf8'); const parsedData = JSON.parse(existingContent); // 兼容首次写入的单个对象:转成数组 accountList = Array.isArray(parsedData.LoginSuccessfully) ? parsedData.LoginSuccessfully : [parsedData.LoginSuccessfully]; } catch (err) { // 文件不存在(首次写入)或解析失败时初始化空数组 if (err.code !== 'ENOENT') { console.error('读取/解析文件失败:', err); } } // 构造新账户对象 const newAccount = { emailAddress: emailAcc, password: globalConstants.password, org: orgName, LoginStatus: "Successfully" }; // 添加新账户到数组 accountList.push(newAccount); // 格式化JSON字符串(缩进2空格,方便阅读) const updatedData = JSON.stringify( { LoginSuccessfully: accountList }, null, 2 ); // 写入文件(务必加await确保异步操作完成) await fileHelper.writeFile(path, updatedData); }
关键说明
- 数据结构变更:从
{LoginSuccessfully: {...}}改成{LoginSuccessfully: [...]}, 用数组存储多条账户记录。 - 异步安全:全程用
await处理文件读写,避免竞态问题(比如多次调用时的写入冲突)。 - 容错处理:兼容文件不存在的首次写入场景,同时捕获非预期的解析错误。
- 语法安全:用
JSON.stringify替代模板字符串构造JSON,避免手动拼接导致的语法错误(比如账户信息含引号时)。
内容的提问来源于stack exchange,提问作者Hiếu Đinh Trần
相关产品推荐
相关产品推荐

