Firebase Cloud Functions与Cloud Messaging联动异常求助
Firebase Cloud Functions 未发送FCM通知问题排查与修复
核心问题分析
用户ID关联错误
代码中const seniorUserId = context.params.ticketId;错误将ticket的文档ID当作senior用户ID,导致查询seniors集合时定位到错误文档,无法获取有效设备令牌(deviceToken)。消息结构不兼容默认通知展示
当前仅使用data字段构造消息,若客户端未专门处理data类型消息,系统不会自动弹出通知,需添加notification字段触发系统默认通知逻辑。Promise处理不规范
分支中直接返回null可能导致函数Promise链异常终止,应返回Promise.resolve()确保函数正常完成生命周期。
修正后的代码
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.notifySeniorOnTicketAcceptance = functions.firestore .document("tickets/{ticketId}") .onUpdate((change, context) => { const newData = change.after.data(); const previousData = change.before.data(); // 检查isAccepted字段是否从false变为true if (newData.isAccepted === true && previousData.isAccepted !== true) { // 从ticket文档中获取关联的senior用户ID(需根据实际业务字段名调整) const seniorUserId = newData.seniorId; if (!seniorUserId) { console.error("Ticket文档中未找到seniorId字段"); return Promise.resolve(); } return admin.firestore().collection("seniors").doc(seniorUserId).get() .then((seniorSnapshot) => { if (seniorSnapshot.exists) { const seniorData = seniorSnapshot.data(); if (seniorData && seniorData.deviceToken) { // 构造包含通知内容和业务数据的消息 const message = { notification: { title: "Ticket Accepted", body: "Your ticket has been accepted." }, data: { ticketId: context.params.ticketId }, token: seniorData.deviceToken, }; return admin.messaging().send(message) .then((response) => { console.log("通知发送成功:", response); return response; }) .catch((sendError) => { console.error("发送通知失败:", sendError); return Promise.reject(sendError); }); } else { console.error("Senior文档缺少deviceToken字段"); return Promise.resolve(); } } else { console.error("未找到对应的Senior文档"); return Promise.resolve(); } }) .catch((error) => { console.error("获取Senior信息失败:", error); return Promise.reject(error); }); } return Promise.resolve(); });
修复说明
- 调整
seniorUserId获取逻辑,从ticket文档的业务字段(示例为seniorId,需匹配实际字段名)提取用户ID,确保查询到正确的seniors文档。 - 添加
notification字段,保证客户端无需额外处理即可展示系统通知;保留data字段传递业务关联数据。 - 统一返回Promise对象,避免函数异常终止,同时增加发送结果日志,便于排查问题。
内容的提问来源于stack exchange,提问作者Yoav
相关产品推荐
相关产品推荐

