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

Firebase Cloud Functions与Cloud Messaging联动异常求助

Firebase Cloud Functions 未发送FCM通知问题排查与修复

核心问题分析

  1. 用户ID关联错误
    代码中const seniorUserId = context.params.ticketId;错误将ticket的文档ID当作senior用户ID,导致查询seniors集合时定位到错误文档,无法获取有效设备令牌(deviceToken)。

  2. 消息结构不兼容默认通知展示
    当前仅使用data字段构造消息,若客户端未专门处理data类型消息,系统不会自动弹出通知,需添加notification字段触发系统默认通知逻辑。

  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:05:21