如何在Firebase Realtime Database新增数据时主动获取对应应用的通知
实现方案
以下提供两种可直接落地的实现路径,你可以根据自己的需求选择:
方案一:使用Firebase Cloud Functions实现(无需独立部署管控程序)
该方案不需要额外开发维护独立服务,是成本最低的实现方式,步骤如下:
- 分别为应用A、应用B的Firebase项目各创建一个Cloud Functions触发器,监听对应Realtime Database的
onCreate事件,触发条件绑定到你需要监听的数据节点路径 - 在触发器代码中内置区分来源的固定标识,比如应用A的触发器生成
[应用A新增数据]的通知标题前缀,应用B的触发器生成[应用B新增数据]的前缀,天然区分两个应用的来源 - 触发器触发时调用邮件发送类库完成通知推送,你可以直接使用Node.js生态的
nodemailer库,绑定自己的发件邮箱账号即可
示例代码片段(Node.js环境):
const functions = require("firebase-functions"); const nodemailer = require("nodemailer"); // 初始化发件邮箱配置 const transporter = nodemailer.createTransport({ service: "你的邮箱服务商", auth: { user: "你的发件邮箱地址", pass: "你的发件邮箱授权码" } }); // 应用A的数据库新增触发器 exports.notifyNewDataA = functions.database.ref('/你要监听的节点路径/{newDataId}') .onCreate((snapshot, context) => { const newData = snapshot.val(); const mailOptions = { from: "数据通知服务", to: "你的收件邮箱地址", subject: "[应用A新增数据] 有新数据提交", text: `新增数据内容:${JSON.stringify(newData)},数据ID:${context.params.newDataId}` }; return transporter.sendMail(mailOptions); });
- 应用B的触发器仅需修改通知标题前缀、绑定到应用B自己的Firebase项目数据库路径即可
注意:敏感的邮箱账号、授权码可以存储在Firebase Cloud Functions的环境变量中,不要直接硬编码到代码里。
方案二:自行开发管控程序实现
如果你需要额外的自定义管控逻辑,要开发独立的管控程序,可以按照以下步骤实现:
- 分别获取应用A、应用B两个Firebase项目的服务账号密钥文件
- 在管控程序中引入Firebase Admin SDK,分别初始化两个独立的Firebase应用实例,给实例添加明确的标识,比如命名为
appA、appB - 分别为两个实例的Realtime Database对应节点添加
child_added事件监听器,该监听器是Firebase SDK原生支持的实时推送机制,不需要你自己实现轮询逻辑,有新增数据时会自动触发回调 - 在回调逻辑中根据触发的实例标识判断数据来源,拼接不同的通知内容,调用邮件发送接口发送通知即可
示例代码片段(Python环境):
import firebase_admin from firebase_admin import credentials, db import smtplib from email.mime.text import MIMEText # 初始化应用A实例 cred_a = credentials.Certificate("应用A的服务账号密钥.json") app_a = firebase_admin.initialize_app(cred_a, { 'databaseURL': '应用A的Realtime Database地址' }, name='appA') # 初始化应用B实例 cred_b = credentials.Certificate("应用B的服务账号密钥.json") app_b = firebase_admin.initialize_app(cred_b, { 'databaseURL': '应用B的Realtime Database地址' }, name='appB') # 通用邮件发送工具 def send_email(source, data): msg = MIMEText(f"新增数据内容:{str(data)}") msg['Subject'] = f"[{source}新增数据]" msg['From'] = "你的发件邮箱" msg['To'] = "你的收件邮箱" with smtplib.SMTP_SSL('smtp.你的邮箱服务商.com', 465) as server: server.login("你的发件邮箱", "你的发件邮箱授权码") server.send_message(msg) # 监听应用A的新增数据 ref_a = db.reference('/你要监听的节点路径', app=app_a) def handle_new_a(event): send_email("应用A", event.data) ref_a.listen(handle_new_a) # 监听应用B的新增数据 ref_b = db.reference('/你要监听的节点路径', app=app_b) def handle_new_b(event): send_email("应用B", event.data) ref_b.listen(handle_new_b)
注意:该管控程序需要保持常驻运行,你可以部署在云服务器、容器服务等支持长时间运行程序的环境中,同时需要补充SDK连接异常的重连逻辑,避免断连后无法收到通知。
内容的提问来源于stack exchange,提问作者user17115124
相关产品推荐
相关产品推荐

