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

Node.js /api/dashboard路由无限加载问题排查求助

问题解决:Express路由请求无限加载的修复方案

核心原因

Express路由处理函数必须通过res.send()、res.json()等方法向客户端发送响应。你当前代码最后仅通过return返回了一个对象,没有触发响应发送逻辑,导致客户端一直处于等待状态,最终表现为请求无限加载。

修复步骤及优化建议

  1. 替换返回逻辑,触发响应发送
    将代码末尾的return { ... }替换为res.json({ ... }),让Express把数据作为JSON响应发送给客户端。

  2. 避免await与.then()混用
    当前代码同时使用await和.then(),写法冗余且易出错,统一使用await让代码逻辑更清晰。

  3. 数据库查询性能优化(推荐)
    不要查询所有文档后再用reduce过滤,直接用MongoDB的countDocuments方法做条件统计,大幅减少内存占用和查询时间:

    • 统计用户已完成考试:直接根据userId筛选计数
    • 统计活跃考试:将notDue(exam.due)的逻辑转换为MongoDB查询条件(例如判断截止时间晚于当前时间)

修复后的完整代码示例

router.get("/", async (req, res, next) => {
  let userID;
  try {
    const jwt = req.headers.authorisation.split(" ")[1];
    const { payload } = verifyToken(jwt, res);
    userID = payload?.id;
  } catch (err) {
    return next(err); // 加return避免后续代码继续执行
  }

  let numberCompletedExams;
  try {
    // 直接通过countDocuments统计符合条件的文档数
    numberCompletedExams = await ExamResult.countDocuments({ userId: userID });
  } catch (err) {
    return next(err);
  }

  let numberActiveExams;
  try {
    // 根据notDue的实际逻辑替换查询条件,示例为"截止时间晚于当前时间"
    numberActiveExams = await Exam.countDocuments({ due: { $gt: new Date() } });
  } catch (err) {
    return next(err);
  }

  // 用res.json发送响应给客户端
  res.json({
    total: numberCompletedExams + numberActiveExams,
    active: numberActiveExams,
    completed: numberCompletedExams
  });
});

额外注意事项

  • 在catch块中调用next(err)时建议添加return,防止后续代码继续执行引发不必要的错误
  • 确认verifyToken函数未提前终止响应或抛出未捕获的异常
  • 若matchesUser、notDue有复杂逻辑,需确保能正确转换为MongoDB的查询条件,避免全表扫描

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:10:21