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

FreeCodeCamp餐厅评论项目:无法添加/更新评论求助

MERN餐厅评论项目问题解决方案

问题1:提交评论后MongoDB字段为null,前端无显示

排查与修复步骤

  • 前端请求数据校验:检查提交评论时的Axios请求payload,确认是否正确携带了text、用户name和user_id。如果用户信息从Auth状态(如Context/Redux)获取,确保登录后用户数据已正确存储,且请求体字段名与后端一致(比如后端用user_id,前端别传userId)。
  • 后端认证与数据获取:确保评论创建接口已接入认证中间件(如JWT验证),并从req.user中提取用户信息,而非直接从请求体拿。示例修复代码:
    // 后端评论路由 - 创建评论
    router.post('/', authMiddleware, async (req, res) => {
      try {
        const newReview = new Review({
          name: req.user.name, // 从认证后的req.user取,而非req.body
          user_id: req.user._id,
          text: req.body.text,
          restaurantId: req.body.restaurantId
        });
        const savedReview = await newReview.save();
        res.status(201).json(savedReview);
      } catch (err) {
        res.status(400).json({ message: err.message });
      }
    });
    
  • MongoDB模型校验:检查Review模型定义,确保name、user_id、text字段未设置default: null,且字段名与后端代码一致。示例模型:
    const reviewSchema = new mongoose.Schema({
      name: { type: String, required: true },
      user_id: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
      text: { type: String, required: true },
      restaurantId: { type: String, required: true }
    });
    
  • 前端刷新逻辑:提交成功后,确保前端重新拉取评论列表,而非仅依赖本地状态更新。

问题2:更新评论时出现500内部服务器错误

排查与修复步骤

  • 查看后端错误日志:直接查看服务器控制台的报错信息,500错误通常伴随具体原因(如“评论不存在”“权限不足”“数据库语法错误”)。
  • 后端更新接口逻辑修复:确保接口包含错误捕获、权限验证和正确的数据库操作。示例修复代码:
    // 后端评论路由 - 更新评论
    router.put('/:id', authMiddleware, async (req, res) => {
      try {
        // 查找目标评论
        const review = await Review.findById(req.params.id);
        if (!review) {
          return res.status(404).json({ message: '评论不存在' });
        }
        // 验证当前用户是否为评论作者
        if (review.user_id.toString() !== req.user._id.toString()) {
          return res.status(403).json({ message: '无权限修改该评论' });
        }
        // 更新评论内容
        const updatedReview = await Review.findByIdAndUpdate(
          req.params.id,
          { text: req.body.text },
          { new: true, runValidators: true } // 返回更新后的数据,同时触发验证
        );
        res.json(updatedReview);
      } catch (err) {
        res.status(500).json({ message: err.message }); // 返回具体错误信息,方便前端调试
      }
    });
    
  • 前端请求校验:确认更新请求使用PUT/PATCH方法,正确传递评论ID(在URL参数中),且请求体包含text字段。示例前端请求:
    // 前端更新评论的Axios请求
    const updateReview = async (reviewId, newText) => {
      try {
        const response = await axios.put(`/api/reviews/${reviewId}`, { text: newText }, {
          headers: { Authorization: `Bearer ${token}` }
        });
        // 更新本地评论列表
        return response.data;
      } catch (err) {
        console.error(err.response.data.message); // 打印具体错误信息
      }
    };
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:50:26