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

在Node.js Express的POST路由中实现JSON文件的读取与追加写入

如何在Express POST路由中更新JSON数据文件

没问题,我来帮你实现这个需求!你现在的代码已经能获取请求里的公寓数据,但还缺了读写JSON文件的关键步骤——直接require进来的JSON是静态加载到内存里的,修改数组后不会自动同步到磁盘上的文件,所以得用Node.js的文件系统模块来手动完成读写操作。

下面是完善后的路由代码,我会一步步给你解释:

const express = require("express");
const router = express.Router();
const fs = require("fs/promises"); // 使用Promise版的fs,搭配async/await更简洁
const path = require("path");

// 用path模块拼接JSON文件的绝对路径,避免相对路径的坑
const apartmentsFilePath = path.join(__dirname, "../db/apartments.json");

router.post('/', async (req, res, next) => {
  try {
    // 1. 读取磁盘上的JSON文件内容
    const fileContent = await fs.readFile(apartmentsFilePath, "utf8");
    // 2. 把JSON字符串解析成JavaScript数组
    let apartments = JSON.parse(fileContent);

    // 3. 从请求体创建新的公寓对象(这里可以优化自动生成ID,后面会提到)
    let apa = { 
      id: req.body.id, 
      address: req.body.address 
    };

    // 4. 将新对象推入数组
    apartments.push(apa);

    // 5. 把数组转换回格式化后的JSON字符串(null和2是为了让JSON文件更易读)
    const updatedJson = JSON.stringify(apartments, null, 2);
    // 6. 把更新后的JSON写回文件
    await fs.writeFile(apartmentsFilePath, updatedJson, "utf8");

    // 7. 给客户端返回成功响应
    res.status(201).json({ 
      message: "公寓信息添加成功", 
      addedApartment: apa 
    });
  } catch (error) {
    // 捕获并处理所有可能的错误(比如文件读写失败、JSON解析错误等)
    console.error("添加公寓时出现错误:", error);
    res.status(500).json({ 
      message: "服务器内部错误", 
      errorDetails: error.message 
    });
  }
});

module.exports = router;

几个重要的注意事项:

  • 用绝对路径定位文件:用path.join(__dirname, "../db/apartments.json")生成绝对路径,不管你的路由文件被哪里引用,都能准确找到JSON文件,避免相对路径在不同运行环境下失效的问题。
  • 异步操作处理:用fs/promises配合async/await来处理文件读写,比传统的回调函数更易读,也避免了回调地狱。
  • 错误处理:用try/catch包裹所有异步操作,能捕获文件不存在、权限不足、JSON格式错误等异常,给客户端返回友好的错误信息。
  • ID自动生成优化:如果不想让客户端传入ID(避免重复或无效ID),可以自动生成数组中最大ID+1,代码如下:
    // 自动生成不重复的ID
    const maxId = apartments.length > 0 ? Math.max(...apartments.map(apt => apt.id)) : -1;
    let apa = { 
      id: maxId + 1, 
      address: req.body.address 
    };
    
  • 确保请求体解析正常:要在你的主Express应用文件中添加express.json()中间件,否则req.body会是undefined:
    const express = require("express");
    const app = express();
    // 解析JSON格式的请求体
    app.use(express.json());
    // 挂载你的路由
    app.use("/api", require("./routes/your-router-file"));
    

内容的提问来源于stack exchange,提问作者CodeRonin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:30:02