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

获取指定日期区间任务的路由及数据查询故障排查请求

问题排查与解决

1. 日期格式解析错误

你的from参数格式是YYYY-MM-DD(如2022-08-31),但moment解析时指定的格式是"YYYY/MM/DD",这会导致moment无法正确识别日期,生成Invalid Date,最终MongoDB的查询条件完全失效。

修复方式:
将moment的格式参数改为匹配的"YYYY-MM-DD",或直接省略格式参数(moment可自动识别ISO标准日期格式),同时直接生成Date对象给MongoDB,无需转字符串:

// 写法1:指定正确格式
$gt: moment(from, "YYYY-MM-DD").toDate(),
$lt: moment(to, "YYYY-MM-DD").toDate()

// 写法2:自动识别格式(更简洁)
$gt: moment(from).toDate(),
$lt: moment(to).toDate()

2. 查询边界覆盖问题

如果你的tasks集合中day字段包含具体时间(如2022-08-31T14:23:00.000Z),仅用$gt和$lt会漏掉结束日当天的任务。比如to=2022-10-26转成默认Date是2022-10-26T00:00:00.000Z,$lt会排除当天所有非零点的任务。

优化查询条件:
用$gte包含起始日的所有时间,同时给结束日加一天后用$lt,确保覆盖结束日全天的任务:

day: {
    $gte: moment(from).startOf('day').toDate(),
    $lt: moment(to).add(1, 'day').startOf('day').toDate()
}

3. 确认参数获取有效性

虽然你用req.query.from获取参数是正确的(GET请求参数在req.query中,req.params对应路由参数、req.body对应POST请求体,这里都用不上),但可以先确认控制台输出的from和to是否为预期的日期字符串,排除参数传递环节的问题。

4. 表单UI小修复(不影响功能)

表单中to的label文字误写为From,建议修正避免用户混淆:

<div class="from-group">
   <label for="to">To</label>
   <input type="date" name="to" id="to">
</div>

完整修复后的控制器代码

getRange: async (req, res) => {
    const { from, to } = req.query;
    console.log('日期范围:', from, to);

    try {
        const tasks = await Tasks.find({
            day: {
                $gte: moment(from).startOf('day').toDate(),
                $lt: moment(to).add(1, 'day').startOf('day').toDate()
            },
            user: req.user.id
        });

        res.render("dashboard.ejs", {
            tasks,
            title: "range filter",
            user: req.user
        });
    } catch (err) {
        console.error('查询任务失败:', err);
        res.status(500).send('服务器错误');
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:05:23