POST添加用户后GET请求返回用户数组始终为空的问题求助
POST添加用户后GET请求返回用户数组始终为空的问题求助
兄弟,我看了你的代码,马上就发现问题出在哪了!你现在用内存里的array变量来存用户,这完全是踩了个大坑啊😅
问题根源分析
- 内存数组的致命局限性:你定义的
const array = []是存在服务器进程内存里的,一旦服务器重启(比如平台自动重启、本地重启服务),这个数组就会被清空。而且这个数组只在你通过POST接口添加用户时才会push数据,完全和数据库脱节——比如你直接在MongoDB里手动加个用户,数组里根本不会有;反过来,服务器重启后,数据库里的用户还在,但数组是空的,GET接口自然返回空。 - Schema设计跑偏:你把用户的
username和锻炼记录的description、duration、date塞在同一个Schema里了,这不符合FCC后端挑战的要求啊!正确的设计应该是:用户Schema只存username,锻炼记录单独做一个Schema,通过用户ID关联,这样一个用户可以对应多条锻炼记录。 - 接口逻辑的小错误:你的POST接口里
await newUser.save(newUser)写法不对,save()方法不需要传参数,直接await newUser.save()就行;而且你完全没必要把用户推到内存数组里,纯纯多余操作。
解决方案
核心思路就是:所有用户数据都从MongoDB读取和写入,彻底抛弃内存数组,下面是修改后的完整代码,我标了关键修改点:
require('dotenv').config(); console.log(process.env.MONGO); const express = require('express'); const app = express(); const bodyParser = require('body-parser'); const cors = require('cors'); const mongoose = require('mongoose'); // 移除没用的内存数组!!! // const array = []; // 连接数据库 mongoose.connect(process.env.MONGO) .then(() => console.log("DB connected!")) .catch(err => console.error("error connecting to mongo", err)); app.use(cors()) app.use(express.static('public')) app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.get('/', (req, res) => { res.sendFile(__dirname + '/views/index.html') }); // 修正1:拆分Schema,用户只存用户名 const userSchema = new mongoose.Schema({ username: { type: String, required: true, // 你之前写错成require了!这会导致字段校验失效 unique: true // 加唯一约束,避免重复用户名 } }); // 修正2:单独做锻炼记录Schema,关联用户ID const exerciseSchema = new mongoose.Schema({ userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, description: { type: String, required: true }, duration: { type: Number, required: true }, date: { type: Date, default: Date.now } // 默认用当前时间 }); // 修正3:Mongoose模型名首字母大写(行业规范) const User = mongoose.model('User', userSchema); const Exercise = mongoose.model('Exercise', exerciseSchema); app.post('/api/users', async function (req, res) { try { const username = req.body.username; // 先检查用户名是否已存在,避免重复创建 const existingUser = await User.findOne({ username }); if (existingUser) { return res.json({ _id: existingUser._id, username: existingUser.username }); } // 创建并保存新用户 const newUser = new User({ username }); await newUser.save(); // 这里不需要传参数! // 直接返回新用户信息 res.json({ _id: newUser._id, username: newUser.username }); } catch (err) { console.error(err); res.status(500).json({ error: '创建用户失败' }); } }) app.get('/api/users', async function (req, res) { try { // 从数据库查询所有用户,排除__v字段(前端不需要) const allUsers = await User.find({}, { __v: 0 }); res.json(allUsers); } catch (err) { console.error(err); res.status(500).json({ error: '获取用户列表失败' }); } }) // 后续可以按照FCC要求,添加POST /api/users/:_id/exercises等接口 const listener = app.listen(process.env.PORT || 3000, () => { console.log('Your app is listening on port ' + listener.address().port) })
关键修改说明
- 彻底抛弃内存数组:所有用户数据都从MongoDB读取,再也不用担心服务器重启后数据丢失、数据不同步的问题。
- 修正Schema设计:把用户和锻炼记录拆分成两个独立Schema,既符合FCC挑战要求,也更符合数据库设计的规范。
- 修复接口逻辑:
- POST接口:新增用户名重复检查,避免重复创建;修正
save()方法的错误写法;直接返回新用户信息,不再依赖内存数组。 - GET接口:用
User.find()从数据库拉取所有用户,返回的永远是最新的数据库数据。
- POST接口:新增用户名重复检查,避免重复创建;修正
- 修复Schema细节错误:把
require改成正确的required,给用户名加唯一约束,避免重复数据。
这样修改后,你的GET /api/users接口就会稳定返回数据库里的所有用户,再也不会出现空数组的问题了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

