如何以无服务器方式集成Firebase实时数据库与FCM?
无服务器实现Firebase实时数据库+FCM推送通知方案
完全不需要搭建自有服务器,用Firebase的Cloud Functions就能实现这个需求——这是Firebase官方提供的无服务器计算服务,可直接监听实时数据库的变更事件,触发FCM推送。
步骤1:准备工作
- 确保你的Firebase项目已启用实时数据库、Cloud Messaging(FCM)和Cloud Functions
- 本地安装Firebase CLI:
npm install -g firebase-tools,登录账号后执行firebase init functions初始化函数项目(按需选择JavaScript/TypeScript)
步骤2:编写监听数据库并发送推送的函数
在functions/index.js(或.ts)中编写核心逻辑:监听目标节点的新增数据事件,读取设备令牌,调用FCM发送推送。
示例代码(JavaScript):
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); // 监听/orders节点的新数据插入事件 exports.sendNewOrderNotification = functions.database.ref("/orders/{orderId}") .onCreate(async (snapshot, context) => { // 获取新增的数据内容 const newOrder = snapshot.val(); const orderId = context.params.orderId; // 从数据库读取所有有效设备令牌(假设/tokens节点存储用户的FCM令牌) const tokensSnapshot = await admin.database().ref("/tokens").once("value"); const tokens = Object.keys(tokensSnapshot.val() || {}); if (tokens.length === 0) { functions.logger.info("无可用设备令牌,跳过推送"); return null; } // 构造FCM推送消息 const payload = { notification: { title: "新订单提醒", body: `订单${orderId}已创建:${newOrder.productName}` }, data: { orderId: orderId, click_action: "FLUTTER_NOTIFICATION_CLICK" // 跨平台跳转标识,按需修改 } }; // 发送批量推送 try { const response = await admin.messaging().sendMulticast({ tokens: tokens, notification: payload.notification, data: payload.data }); functions.logger.info(`推送成功:${response.successCount}条,失败${response.failureCount}条`); // 自动清理无效令牌(可选) const invalidTokens = []; response.responses.forEach((resp, idx) => { if (!resp.success) invalidTokens.push(tokens[idx]); }); if (invalidTokens.length > 0) { const updates = {}; invalidTokens.forEach(token => updates[`/tokens/${token}`] = null); await admin.database().ref().update(updates); functions.logger.info(`清理了${invalidTokens.length}个无效令牌`); } return null; } catch (error) { functions.logger.error("推送失败:", error); return null; } });
步骤3:部署函数
在函数项目目录下执行:
firebase deploy --only functions
部署完成后,Cloud Functions会自动关联实时数据库,后续目标节点有新数据插入时,将自动触发推送。
关键注意点
- 令牌存储:客户端需在用户首次启动或登录时,调用FCM API获取设备令牌,写入实时数据库的
/tokens节点(建议用用户ID作为键,方便后续定向推送) - 权限控制:给实时数据库设置安全规则,确保令牌节点仅合法用户可读写,示例规则:
{ "rules": { "tokens": { "$userId": { ".write": "$userId === auth.uid", ".read": false } } } } - 定向推送:若无需全员推送,可在新增数据时关联目标用户ID,仅读取该用户的令牌发送通知
内容的提问来源于stack exchange,提问作者Darshan Gulhane
相关产品推荐
相关产品推荐

