Firebase Cloud Function创建新文档时无法发送推送问题排查
问题分析与修复方案
你的代码里获取用户token的逻辑存在两个关键错误,导致无法正确拿到token,进而推送失败:
文档查询方法错误
要获取users集合中指定uid的文档,不能直接用collection("users").get(uid),get()方法不带参数时是获取整个集合的所有文档,获取单个文档需要先通过doc(uid)指定文档路径,再调用get()获取文档快照。数据读取方式错误
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
相关产品推荐
相关产品推荐

