Firebase实时数据库新增数据时,如何用Node.js触发Android管理员端通知函数
实现SOS求助触发管理员通知的Firebase方案
1. 数据库结构规划
先确定两个核心节点:
/sos-requests/{requestId}:存储用户发起的求助数据,字段示例:userId(发起者ID)、location(定位信息)、message(求助描述)、timestamp(发起时间)/admin-tokens/{adminUid}:存储每个管理员的FCM推送令牌,用于定向发送通知
2. 部署Cloud Function监听求助事件
创建实时数据库的onCreate触发器,监听sos-requests节点的新增数据,批量给管理员发送通知。以下是Node.js实现代码:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.sendSOSNotification = functions.database.ref('/sos-requests/{requestId}') .onCreate(async (snapshot, context) => { // 提取新增的求助数据 const sosData = snapshot.val(); // 获取所有管理员的FCM令牌 const tokensSnapshot = await admin.database().ref('/admin-tokens').once('value'); const tokens = Object.values(tokensSnapshot.val() || {}); if (!tokens.length) { functions.logger.info('无有效管理员令牌,终止通知发送'); return; } // 构造通知内容 const payload = { notification: { title: '⚠️ 紧急SOS求助', body: `用户${sosData.userId || '匿名'}发起求助,位置:${sosData.location || '未知'}`, clickAction: 'FLUTTER_NOTIFICATION_CLICK' // 适配你的客户端框架,原生平台可替换对应值 }, data: { requestId: context.params.requestId, location: sosData.location || '', message: sosData.message || '' } }; // 发送通知并处理结果 try { const response = await admin.messaging().sendToDevice(tokens, payload); functions.logger.info('通知发送完成', response); // 自动清理无效令牌(可选,避免后续重复失败) const cleanupTasks = []; response.results.forEach((result, index) => { const error = result.error; if (error) { functions.logger.error(`令牌 ${tokens[index]} 发送失败`, error); if (['messaging/invalid-registration-token', 'messaging/registration-token-not-registered'].includes(error.code)) { const tokenKey = Object.keys(tokensSnapshot.val())[index]; cleanupTasks.push(tokensSnapshot.ref.child(tokenKey).remove()); } } }); return Promise.all(cleanupTasks); } catch (err) { functions.logger.error('通知发送异常', err); return; } });
3. 管理员端令牌存储与通知接收
存储FCM令牌
管理员App启动或令牌更新时,将当前设备的FCM令牌保存到数据库,以Flutter为例:
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_database/firebase_database.dart'; Future<void> syncAdminToken(String adminUid) async { final fcmToken = await FirebaseMessaging.instance.getToken(); if (fcmToken != null) { await FirebaseDatabase.instance.ref('admin-tokens/$adminUid').set(fcmToken); } }
处理通知接收
配置消息监听,实现通知点击后的跳转逻辑(比如打开求助详情页),Flutter示例:
FirebaseMessaging.onMessage.listen((RemoteMessage message) { // 前台收到通知时的弹窗逻辑 }); FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { // 点击通知后的跳转,根据requestId查询求助详情 final requestId = message.data['requestId']; // 跳转到详情页的逻辑 });
4. 关键注意事项
- 确保Cloud Function拥有
firebase.database.read和firebase.messaging.send权限,在Firebase控制台函数设置中配置 - 定期同步管理员的FCM令牌,令牌可能因设备重装、App更新等原因失效
- 可在求助数据中添加
status字段(如pending),管理员响应后更新状态,避免重复通知
内容的提问来源于stack exchange,提问作者Timow
相关产品推荐
相关产品推荐

