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

Firebase Cloud Function创建新文档时无法发送推送问题排查

问题分析与修复方案

你的代码里获取用户token的逻辑存在两个关键错误,导致无法正确拿到token,进而推送失败:

  1. 文档查询方法错误
    要获取users集合中指定uid的文档,不能直接用collection("users").get(uid),get()方法不带参数时是获取整个集合的所有文档,获取单个文档需要先通过doc(uid)指定文档路径,再调用get()获取文档快照。

  2. 数据读取方式错误
    get()方法返回的是Promise,需要await后得到文档快照对象,要读取文档里的字段,得先调用data()方法拿到文档的JSON数据,再从中提取token字段,而不是直接链式调用.get("token")。

修正后的完整代码如下:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const { firestore } = require("firebase-admin");

admin.initializeApp(functions.config().firebase);

const fcm = admin.messaging();

exports.senddevices = functions.firestore
.document("event/{uid}")
.onCreate( async (snapshot) => {
  const uid = snapshot.get("assigned_author_id");

  // 修正后的token获取逻辑
  const userDoc = await firestore.collection("users").doc(uid).get();
  if (!userDoc.exists) {
    // 可选:处理用户文档不存在的情况,避免后续报错
    console.log(`用户 ${uid} 的文档不存在`);
    return null;
  }
  const token = userDoc.data().token;

  const name = snapshot.get("name");
  const description = snapshot.get("description");
  const message = {
    data: {
      name: name,
      description: description,
      uid: uid,
    },
    token: token,
  };
  return fcm.send(message);
});

另外建议加上用户文档不存在的判断逻辑,避免因为找不到文档导致函数报错中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:24:56