Node.js实现当前进行中事件查询函数的问题求助
修复你的当前进行中事件查询函数
你的代码存在几个关键问题,导致无法正常运行,下面逐一说明并给出修正方案:
原代码的核心问题
- return位置错误:
return eventPresent写在for循环内部,第一次循环就直接返回,不会遍历所有事件。 - 日期解析错误:
new Date('"' + ... + '"')里的多余引号会导致日期解析失败,生成无效的Date对象。 - 逻辑判断错误:当前进行中的事件应该是今日在startDate和endDate区间内,原条件的逻辑完全颠倒了。
- 数据存储错误:
eventPresent.push(i)存储的是事件索引,不是事件对象,前端拿到的是一堆数字而非事件数据。 - 冗余判断:startDate/endDate是Date类型,不会是空字符串,无需判断
!= ''。
修复后的版本(保留循环逻辑)
exports.listPresent = async (req, res) => { try { // 变量名改为events,更符合数组语义 const events = await Event.find({}) const eventPresent = []; const today = new Date().setHours(0, 0, 0, 0); for (let i = 0; i < events.length; i++) { const event = events[i]; // 先判断日期是否存在 if (!event.startDate || !event.endDate) continue; // 直接用Date对象处理,无需转字符串拆分 const startDate = new Date(event.startDate).setHours(0, 0, 0, 0); const endDate = new Date(event.endDate).setHours(0, 0, 0, 0); // 正确逻辑:今日 >= 开始日期 且 今日 <= 结束日期 if (today >= startDate && today <= endDate) { eventPresent.push(event); } } // 循环结束后再返回结果 res.status(200).json(eventPresent); } catch (error) { res.status(500).json({ error: error.message }); } };
更高效的方案:用Mongoose直接查询过滤
不需要查询所有事件再循环过滤,直接让数据库做筛选,性能更好:
exports.listPresent = async (req, res) => { try { const today = new Date(); today.setHours(0, 0, 0, 0); const tomorrow = new Date(today); tomorrow.setDate(tomorrow.getDate() + 1); // 查询startDate <= 今日 且 endDate >= 今日的事件 const eventPresent = await Event.find({ startDate: { $lte: tomorrow }, endDate: { $gte: today } }); res.status(200).json(eventPresent); } catch (error) { res.status(500).json({ error: error.message }); } };
这里用$lte(小于等于)和$gte(大于等于),把today设为当天0点,tomorrow为次日0点,确保包含所有跨天的事件(比如昨天开始、明天结束的事件,今日仍在进行中)。
内容的提问来源于stack exchange,提问作者Fjojo
相关产品推荐
相关产品推荐

