如何基于Firebase实时数据库变更触发云函数发送FCM通知
Firebase Cloud Function 实现实时数据库触发推送通知
前提准备
确保你已经初始化了Firebase Cloud Functions项目,并且安装了必要依赖:
npm install firebase-functions firebase-admin --save
完整index.js代码
const functions = require('firebase-functions'); const admin = require('firebase-admin'); // 初始化Firebase Admin SDK admin.initializeApp(); // 创建数据库触发器函数 exports.sendNotificationOnUpdate = functions.database.ref('/notification/{userId}/{notificationId}') .onWrite(async (change, context) => { // 获取变更对应的目标ID(即你说的154578、154580这类ID) const targetId = context.params.userId; // 读取对应ID的FCM令牌 const fcmTokenSnapshot = await admin.database().ref(`/fcm-token/${targetId}/value`).once('value'); const fcmToken = fcmTokenSnapshot.val(); // 如果令牌不存在,直接返回终止执行 if (!fcmToken) { functions.logger.warn(`ID${targetId}未找到FCM令牌`); return null; } // 构造通知内容(可根据业务需求修改字段) const notificationPayload = { notification: { title: '新通知提醒', body: '你有一条新的通知消息', clickAction: 'FLUTTER_NOTIFICATION_CLICK' // 适配客户端跳转逻辑,无需可删除 }, token: fcmToken }; try { // 发送FCM通知 await admin.messaging().send(notificationPayload); functions.logger.info(`通知已成功发送给ID${targetId}`); return null; } catch (error) { functions.logger.error(`发送通知失败:${error.message}`); return null; } });
关键逻辑说明
- 触发器路径:
/notification/{userId}/{notificationId}里的{userId}是通配符,会自动匹配notification节点下的一级子节点ID(如154578),{notificationId}匹配二级子节点(如0)。 - 提取目标ID:通过
context.params.userId直接获取通配符对应的ID值。 - 读取FCM令牌:定位到fcm-token节点下对应ID的value字段,用
once('value')读取单次数据。 - 异常处理:加入令牌不存在、推送失败的判断和日志输出,避免函数运行报错。
部署函数
在项目根目录执行以下命令完成部署:
firebase deploy --only functions
内容的提问来源于stack exchange,提问作者Jam es
相关产品推荐
相关产品推荐

