使用JSON与本地存储实现用户注册,append/push操作不生效如何解决?
问题排查与修复方案
核心问题原因
append不是JavaScript数组的原生方法,你通过require导入的userFile是JSON解析后的数组对象,新增元素需要调用push()方法- 通过
require加载的JSON文件仅存在于服务运行时的内存中,修改内存变量不会自动同步到磁盘的users.json文件,服务重启后数据会全部丢失,必须手动写入磁盘 - 你的代码还存在多处未处理的语法/逻辑错误:
- 未引入
body-parser依赖就直接调用 - 你已经导入了
uuidv4,但代码里调用的genarateUuid()是不存在的方法 res.err()不是Express的内置方法,错误响应需要指定状态码后返回内容/products接口用到的productFile变量未定义
- 未引入
具体修复步骤
- 引入Node.js内置的
fs(文件系统)和path模块,用于读写磁盘上的JSON文件 - 新增用户时先调用
push()方法把用户对象添加到内存的用户数组中 - 将修改后的用户数组序列化为格式化的JSON字符串,写入到
users.json文件 - 修复其余语法错误
完整修改后的代码示例
const express = require("express"); const fs = require("fs"); const path = require("path"); const bodyParser = require("body-parser"); const {v4: uuidv4} = require('uuid'); // 定义users.json的绝对路径,避免路径解析错误 const USER_FILE_PATH = path.join(__dirname, "./users.json"); let userFile = require(USER_FILE_PATH); // 如果需要products接口请自行导入对应的product.json // const productFile = require("./products.json"); const port = process.env.PORT || 3005; const app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); app.use(express.json()); app.get("/users", ((req, res) => { res.status(200).send(userFile); })); // 如需使用请先导入productFile // app.get("/products",((req, res) => { // res.status(200).send(productFile); // })) app.post(`/register`, async (req, res, next) => { // 校验参数合法性 if(!req.body.username || !req.body.password) { return res.status(400).json({error: "用户名和密码不能为空"}); } // 生成用户ID let id = uuidv4(); // 构造用户对象 let user = { id: id, username: req.body.username, password: req.body.password, cart: [], purchases: [], login: [], sessions: [], isAdmin: false }; // 添加到内存数组 userFile.push(user); // 写入到磁盘文件,确保数据持久化 fs.writeFile(USER_FILE_PATH, JSON.stringify(userFile, null, 2), (err) => { if (err) { return res.status(500).json({error: "用户存储失败"}); } res.status(200).json(user); }); }); app.listen(port, () => { console.log(`服务运行在端口${port}`); });
注意:单JSON文件存储只适合低并发的测试场景,如果有多个注册请求同时触发,会出现文件写入竞态问题导致数据丢失,生产环境建议使用正规数据库存储数据
内容的提问来源于stack exchange,提问作者Yuki1112
相关产品推荐
相关产品推荐

