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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:15:40