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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:35:22