在Node.js服务端使用Firebase Cloud Messaging按指定日期时间调度推送通知
FCM 定时发送通知实现方案
Firebase Admin SDK 本身没有提供内置的定时发送API,你可以通过以下两种常见方案实现指定时间调度发送的需求:
方案1:Node 服务端本地集成定时任务库
适合你已经有自建Node服务的场景,可以直接引入定时任务库实现调度:
- 第一步:安装常用定时任务库
node-schedulenpm install node-schedule - 第二步:编写定时发送逻辑,示例如下:
const schedule = require('node-schedule'); const admin = require('firebase-admin'); // 此处用你已有的firebase admin初始化逻辑 // admin.initializeApp(yourConfig); // 定义圣诞节发送时间:注意JS中月份从0开始计数,11代表12月 const sendTime = new Date(2024, 11, 25, 0, 0, 0); // 注册定时任务 const christmasNotifyJob = schedule.scheduleJob(sendTime, async () => { const registrationToken = '目标设备的token'; const message = { notification: { title: '圣诞快乐', body: '快来领取你的圣诞福利' } }; const notify_options = { priority: 'high' }; try { const response = await admin.messaging().sendToDevice(registrationToken, message, notify_options); console.log('通知发送成功', response); } catch (error) { console.error('通知发送失败', error); } }); - 注意事项:
- 单实例Node服务下该方案直接可用,多实例部署时需要添加分布式锁避免同一通知重复发送
- 服务重启时会丢失内存中的定时任务,长期运行的调度建议将任务配置持久化到数据库,服务启动时重新加载
方案2:使用 Firebase 云函数定时触发器
如果你不想在自建服务中维护定时任务,也可以用 Firebase Functions 的定时调度能力:
- 直接在云函数中定义 Cron 表达式指定触发时间,触发后自动调用FCM发送逻辑即可,无需自己维护服务可用性和任务持久化。
通用注意事项
- 跨时区场景建议统一使用UTC时间计算定时点,避免时区偏差导致发送时间不符合预期
- 批量发送前建议先校验registrationToken的有效性,减少无效请求浪费配额
- 触发发送时要做好异常捕获和重试逻辑,避免偶发网络问题导致发送失败
内容的提问来源于stack exchange,提问作者SDB_1998
相关产品推荐
相关产品推荐

