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

FCM + NodeJS 后台推送通知:Chrome后台收消息不弹通知代码排查

代码存在的核心问题

你当前的代码只适配了数据类型的推送消息,未兼容Firebase Cloud Messaging(FCM)的两种推送消息格式:

  • 通知消息:推送字段存放在payload.notification下,FCM默认会自动弹通知,但如果你手动监听了onBackgroundMessage,默认逻辑会被覆盖,需要自己从notification字段取值
  • 数据消息:推送字段存放在payload.data下,就是你当前代码的取值逻辑

如果后台推送时混用两种格式,就会出现拿到的title或body为空,触发showNotification时参数非法导致通知不弹出。

修复后的代码示例

messaging.onBackgroundMessage((payload) => {
  console.log("event content ==>", payload)
  console.log('[firebase-messaging-sw.js] Background Push Received ', payload);
  
  // 兼容两种推送格式,优先取通知消息字段,没有再取数据消息字段
  const notificationPayload = payload.notification || payload.data || {};
  const title = notificationPayload.title || "新通知";
  const body = notificationPayload.body || "你收到了一条新消息";
  const icon = notificationPayload.icon || '/gmp-icon.png';

  const options = {
    body: body,
    icon: icon,
    // 建议加上data字段,方便后续点击通知跳转逻辑使用
    data: payload.data || {}
  };

  // 加异常捕获,避免字段异常导致执行中断
  try {
    return self.registration.showNotification(title, options);
  } catch (error) {
    console.error("通知弹出失败:", error);
  }
});

额外排查点

  • 确认Chrome的站点通知权限已开启:访问chrome://settings/content/notifications,检查你的站点不在禁止列表中
  • 确认操作系统没有禁用Chrome的通知权限,也没有开启专注模式/免打扰模式
  • 确认推送发送时没有设置content_available为false或者其他静默推送参数
  • 如果是HTTP站点,Chrome不支持后台推送,必须部署为HTTPS(localhost开发环境除外)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 01:33:02