获取指定日期区间任务的路由及数据查询故障排查请求
问题排查与解决
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
相关产品推荐
相关产品推荐

