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

POST添加用户后GET请求返回用户数组始终为空的问题求助

POST添加用户后GET请求返回用户数组始终为空的问题求助

兄弟,我看了你的代码,马上就发现问题出在哪了!你现在用内存里的array变量来存用户,这完全是踩了个大坑啊😅

问题根源分析

  1. 内存数组的致命局限性:你定义的const array = []是存在服务器进程内存里的,一旦服务器重启(比如平台自动重启、本地重启服务),这个数组就会被清空。而且这个数组只在你通过POST接口添加用户时才会push数据,完全和数据库脱节——比如你直接在MongoDB里手动加个用户,数组里根本不会有;反过来,服务器重启后,数据库里的用户还在,但数组是空的,GET接口自然返回空。
  2. Schema设计跑偏:你把用户的username和锻炼记录的description、duration、date塞在同一个Schema里了,这不符合FCC后端挑战的要求啊!正确的设计应该是:用户Schema只存username,锻炼记录单独做一个Schema,通过用户ID关联,这样一个用户可以对应多条锻炼记录。
  3. 接口逻辑的小错误:你的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)
})

关键修改说明

  1. 彻底抛弃内存数组:所有用户数据都从MongoDB读取,再也不用担心服务器重启后数据丢失、数据不同步的问题。
  2. 修正Schema设计:把用户和锻炼记录拆分成两个独立Schema,既符合FCC挑战要求,也更符合数据库设计的规范。
  3. 修复接口逻辑:
    • POST接口:新增用户名重复检查,避免重复创建;修正save()方法的错误写法;直接返回新用户信息,不再依赖内存数组。
    • GET接口:用User.find()从数据库拉取所有用户,返回的永远是最新的数据库数据。
  4. 修复Schema细节错误:把require改成正确的required,给用户名加唯一约束,避免重复数据。

这样修改后,你的GET /api/users接口就会稳定返回数据库里的所有用户,再也不会出现空数组的问题了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:13:03