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
相关产品推荐
相关产品推荐

