You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:13:15