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

Node.js中向已有db.json文件追加数据被覆盖如何解决?

问题核心原因

你的代码存在两个核心错误导致数据被覆盖:

  1. 调用了异步的fs.readFile()但没有等待读取完成、也没有对读取到的原有数据做任何处理,直接将单条用户数据写入文件,自然会覆盖原有内容
  2. 没有按照db.json的结构,将新用户追加到users数组中,而是直接把请求体作为整个文件内容写入

修复后的实现代码

const fs = require('fs')
const path = require('path')

server.post("/register", (req, res) => {
    const {firstname, lastname, email, password, address, city} = req.body
    if(firstname && lastname && email && password && address && city) {
        try {
            // 1. 同步读取db.json文件内容,确保读取完成再做后续操作
            const dbPath = path.join(__dirname, "db.json")
            const dbContent = fs.readFileSync(dbPath, 'utf-8')
            // 2. 解析为JSON对象
            const db = JSON.parse(dbContent)
            // 3. 将新用户追加到users数组
            db.users.push(req.body)
            // 4. 将完整的db对象序列化后写入文件,第三个参数2用于格式化JSON,方便阅读
            fs.writeFileSync(dbPath, JSON.stringify(db, null, 2), {encoding: "utf-8"})
            res.status(201).send({
                message: "User created!"
           })
        } catch (error) {
            res.status(500).send({
                code: error.code,
                message: error.message
            })
        }
    }else{
        res.status(400).send({ // 此处修改为400更符合语义,属于客户端参数错误
            message: "Missing required user parameters"
        })
    }
})

额外注意事项

  • 首次初始化时如果db.json不存在,可以加判断逻辑,不存在的话先写入{"users": []}的基础结构,避免解析报错
  • 确保你的db.json本身符合JSON语法规范,不要存在多余的尾随逗号,否则会出现解析失败的错误
  • 不要明文存储用户密码,生产环境一定要用bcrypt等工具对密码做哈希加密后再存储
  • 本地JSON文件只适合开发测试用,生产环境建议使用专业数据库存储用户数据
  • 可以增加邮箱唯一性校验,避免同一个邮箱重复注册多个账号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:04