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

如何以无服务器方式集成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:38:19