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

React+MongoDB中如何检测当前用户是否已评分指定影片?

问题解决与优化建议

一、先修复前端状态不重置的问题

你的问题核心是useEffect只处理了“找到评分”的场景,没覆盖“未找到评分”时的状态重置。当切换到未评分影片时,filter结果为空,但代码没执行setIsRated(false),导致isRated保留之前的true值。

修改后的代码可以直接根据检查结果同步更新状态,同时用some替代filter提升性能(找到匹配项就停止遍历,不用生成新数组):

const [isRated, setIsRated] = useState(false)

useEffect(() => {
  const hasRated = rated.some(item => item.movieId === data?.id)
  setIsRated(hasRated)
}, [rated, data?.id])

这样无论切换到哪部影片,只要data.id或rated数组变化,都会重新检查并更新isRated状态,不会再出现状态残留的问题。

二、后端优化建议(针对用户评分较多的场景)

如果用户评分数量很大,前端一次性拉取所有已评分影片会浪费带宽和性能。可以在后端新增一个接口,直接根据用户ID和影片ID查询是否存在评分,避免前端处理大量数据。

后端示例代码(Node.js + MongoDB/Mongoose)

假设你的评分集合名为ratings,新增路由如下:

// 路由文件示例
router.get('/check-rating', async (req, res) => {
  const { userId, movieId } = req.query;
  try {
    // 直接检查是否存在匹配的评分记录
    const ratingExists = await Rating.exists({ userId, movieId });
    res.json({ isRated: !!ratingExists }); // 转换为布尔值返回
  } catch (err) {
    res.status(500).json({ message: '检查评分状态失败' });
  }
});

前端调用示例

在单个影片页面中调用该接口获取状态:

const [isRated, setIsRated] = useState(false)

useEffect(() => {
  const checkUserRating = async () => {
    if (!data?.id) return;
    const response = await fetch(`/api/check-rating?userId=${currentUserId}&movieId=${data.id}`);
    const result = await response.json();
    setIsRated(result.isRated);
  };
  checkUserRating();
}, [data?.id, currentUserId]);

这种方式的优势:

  • 减少前端数据存储和处理量,不用维护全量评分数组
  • 接口返回数据极小,响应速度更快
  • 逻辑更清晰,前端仅关注当前影片的评分状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:33:22