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

Firebase云函数监听实时数据库触发FCM 部署成功无日志无通知排查

日志无法显示的常见原因
  • 首先确认触发条件匹配:你配置的是/chats/{userId}路径的onCreate触发规则,只有该路径下新增节点时才会触发函数,修改、删除已有节点都不会触发,先确认测试操作符合触发条件。
  • 检查控制台项目与部署项目是否一致:本地Firebase CLI如果切换过项目,可能将函数部署到了其他项目中,可执行firebase projects:list确认当前CLI绑定的项目,和你打开的控制台项目保持一致。
  • 调整控制台日志时间范围:Firebase控制台默认只展示最近一段时间的日志,可手动将时间范围调整为最近1小时/30分钟,避免日志因时间范围不匹配未展示。
  • 用CLI拉取全量日志:控制台日志存在数分钟延迟,可直接在本地执行firebase functions:log拉取全量日志,排查更及时。
  • 未捕获异常导致日志上报失败:如果代码运行中抛出未捕获的异常,可能会导致进程在日志上报前就崩溃,你当前代码确实存在可能触发崩溃的逻辑问题。
代码存在的问题(也是收不到通知的核心原因)
  • 通知配置键拼写错误:你定义的payload里键名是notifiction,正确拼写为notification,少了字母a,FCM无法识别该配置,会直接忽略通知推送逻辑。
  • 空值访问风险:如果tokens/${userId}路径不存在,token.val()会返回null,此时直接访问token.val().deviceToken会抛出未捕获的异常,导致函数崩溃,需要先判断token.val()是否存在再读取属性。
  • 可选优化:新版Firebase Admin无需手动传入配置初始化,admin.initializeApp(functions.config.firebase)可简化为admin.initializeApp(),兼容性更好。
修正后的参考代码
const functions = require("firebase-functions");
const admin = require('firebase-admin');

admin.initializeApp();

exports.notificationFCM = functions.database.ref('/chats/{userId}').onCreate(async (snapshot, context) => { 
  const userId = context.params.userId;
  const payload = {
    notification: {
      title: `New message`,
      body: `Click to check your message!`,
      badge: `1`,
      sound: `default`
    }
  };
     
  const tokenSnapshot = await admin.database()
    .ref(`tokens/${userId}`)
    .once('value');
  const tokenVal = tokenSnapshot.val();
  if (tokenVal && tokenVal.deviceToken != null) {
    console.log(userId);
    console.log('Success');
    return admin.messaging().sendToDevice(tokenVal.deviceToken, payload);
  } else {
    console.log('No token available');
    console.log(userId);
    return null;
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:00:00