Node.js /api/dashboard路由无限加载问题排查求助
问题解决:Express路由请求无限加载的修复方案
核心原因
Express路由处理函数必须通过res.send()、res.json()等方法向客户端发送响应。你当前代码最后仅通过return返回了一个对象,没有触发响应发送逻辑,导致客户端一直处于等待状态,最终表现为请求无限加载。
修复步骤及优化建议
替换返回逻辑,触发响应发送
将代码末尾的return { ... }替换为res.json({ ... }),让Express把数据作为JSON响应发送给客户端。避免
await与.then()混用
当前代码同时使用await和.then(),写法冗余且易出错,统一使用await让代码逻辑更清晰。数据库查询性能优化(推荐)
不要查询所有文档后再用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
相关产品推荐
相关产品推荐

