Node.js中如何向JSON文件多层对象内的数组追加字符串
问题分析
你的核心问题是错误地将对象类型的sent_messages当成字符串做拼接操作,这会直接破坏原本的JSON结构,导致后续无法正常读取数组数据。从你的JSON结构来看,sent_messages是一个对象,其中每个键(比如Not_Me_Again)对应一个存储消息的数组,你需要找到对应目标用户的数组,再往里面追加新消息。
修正后的代码
io.on("connection", (socket) => { socket.on("send dm", (dm_user_id, user_id, message) => { const userFile = path.join(__dirname, "data", "users", `${user_id}`, `${user_id}.json`); fs.readFile(userFile, "utf-8", (err, data) => { if (err) { console.error("读取用户文件失败:", err); return; } let parsed_data = JSON.parse(data); const sentMessages = parsed_data.user.app_data.sent_messages; // 1. 如果目标用户的消息数组不存在,先初始化空数组 if (!sentMessages[dm_user_id]) { sentMessages[dm_user_id] = []; } // 2. 向对应数组追加新消息 sentMessages[dm_user_id].push(message); fs.writeFile(userFile, JSON.stringify(parsed_data, null, 2), "utf-8", (err) => { if (err) { console.error("写入用户文件失败:", err); return; } console.log("消息已成功保存"); }); }); }); });
关键改动说明
- 取消错误的字符串拼接操作,改用数组的
push方法追加消息,这是数组添加元素的标准方式 - 新增判断逻辑:如果
sent_messages里没有目标用户(dm_user_id)的键,先创建空数组,避免访问不存在的属性报错 - 完善错误处理:不再直接
throw err(回调中throw会导致进程崩溃),改为打印错误日志并返回,保证服务稳定性 - 写入JSON时添加
null, 2参数,让生成的JSON文件格式化后更易读
进阶优化建议
如果服务并发量较高,直接用readFile+writeFile可能出现文件读写冲突(多个请求同时读写同一文件),可以考虑:
- 使用
fs.promises异步API配合async/await,让代码更简洁易维护 - 引入文件锁机制,或者改用数据库(比如SQLite、MongoDB)存储用户数据,避免文件操作的并发问题
内容的提问来源于stack exchange,提问作者Floor Mann
相关产品推荐
相关产品推荐

