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

如何获取即将1分钟后过期的日历预约并发送通知?

问题分析与解决

你的代码查询不到结果的核心原因是查询范围和需求不匹配,同时Date对象的写法存在可优化点,下面逐步说明:

1. Date对象写法优化

你当前的代码中,DATE.setMinutes(...)会直接修改原DATE对象,导致DATE和NEXT_MINUTE指向同一个时间(当前时间+1分钟),虽然这不是查询失败的直接原因,但会造成变量语义混乱。建议改用时间戳计算来避免修改原对象:

const now = new Date();
// 当前时间+1分钟(用时间戳计算更清晰)
const nextMinute = new Date(now.getTime() + 60 * 1000);
// 如果需要当前时间+2分钟,用于范围查询
const nextTwoMinutes = new Date(now.getTime() + 120 * 1000);

2. 修正查询条件

你的需求是获取距离过期还有1分钟的预约,也就是预约的expireAt应该等于「当前时间+1分钟」左右,需要用范围查询来匹配这个时间区间:

场景1:提前1分钟通知(剩余时间1~2分钟)

如果希望在预约还有1分钟就要过期时发送通知(比如当前时间10:00,预约10:01过期,此时剩余1分钟),对应的expireAt范围是「当前时间+1分钟」到「当前时间+2分钟」,查询条件如下:

async function sendNotification(req: Request, res: Response) {
  const now = new Date();
  const start = new Date(now.getTime() + 60 * 1000); // 当前时间+1分钟
  const end = new Date(now.getTime() + 120 * 1000); // 当前时间+2分钟

  // 用find即可,无需aggregate(简单匹配场景find更高效)
  const appointments = await Calendar.find({
    expireAt: {
      $gte: start,
      $lt: end
    }
  });

  console.log("即将在1分钟后过期的预约 >>", appointments);
  res.status(200).json(appointments);
}

场景2:查询1分钟内即将过期的预约(剩余时间0~1分钟)

如果你的需求是获取接下来1分钟内会过期的预约(比如剩余时间30秒、1分钟),查询条件调整为:

async function sendNotification(req: Request, res: Response) {
  const now = new Date();
  const nextMinute = new Date(now.getTime() + 60 * 1000);

  const appointments = await Calendar.find({
    expireAt: {
      $gt: now, // 排除已过期的预约
      $lt: nextMinute
    }
  });

  console.log("1分钟内即将过期的预约 >>", appointments);
  res.status(200).json(appointments);
}

3. 为什么原代码查不到结果?

你的原代码用$lt: NEXT_MINUTE匹配所有expireAt小于当前时间+1分钟的预约,但你的预约是创建后5分钟自动删除,也就是expireAt等于「创建时间+5分钟」。如果测试时刚创建预约,expireAt会是「当前时间+5分钟」,远大于NEXT_MINUTE(当前时间+1分钟),所以自然查不到结果。你需要等待4分钟后,该预约的expireAt会变为「当前时间+1分钟」,此时用修正后的范围查询就能匹配到。

内容的提问来源于stack exchange,提问作者Mohamed Majilan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:51:30