Node.js中向已有db.json文件追加数据被覆盖如何解决?
问题核心原因
你的代码存在两个核心错误导致数据被覆盖:
- 调用了异步的
fs.readFile()但没有等待读取完成、也没有对读取到的原有数据做任何处理,直接将单条用户数据写入文件,自然会覆盖原有内容 - 没有按照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
相关产品推荐
相关产品推荐

