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

Firebase Cloud Functions中event.params返回undefined问题求助

解决Firebase Cloud Functions中无法获取{appar}参数的问题

你遇到的核心问题是使用了旧版本的Firebase Functions SDK语法,导致无法正确读取路径中的{appar}参数。下面是具体的分析和解决方案:

问题根源

在Firebase Functions SDK v1.0及以后的版本中,实时数据库的onUpdate触发器参数结构已经更新:不再使用单一的event参数,而是拆分为change(存储更新前后的数据快照)和context(存储触发器上下文,包括路径参数)。你之前依赖的event.params已经被移到context.params中,这就是app1返回undefined的原因。

另外,你尝试用snapshot.key获取应用名称也是错误的——因为snapshot = event.data.val()得到的是纯JavaScript对象,而非DataSnapshot实例,自然没有key属性。要获取节点的key,需要从change.after这个DataSnapshot实例中读取。

修改后的完整代码

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(); // 新版SDK无需手动传入config,会自动初始化

exports.sendAppUpdate = functions.database.instance('medelsappen').ref('/apps/{appar}').onUpdate((change, context) => {
  // 获取更新后的应用状态
  const updatedData = change.after.val();
  const appStatus = String(updatedData.status);
  
  // 获取路径参数中的应用名称(两种方式任选其一)
  const appName = context.params.appar;
  // 或者从DataSnapshot直接获取key,结果与context.params.appar一致
  // const appName = change.after.key;

  console.log("Aktuell app: ", appName, ", Status: ", appStatus);
  const notificationContent = `${appName} , ny status: ${appStatus}`;
  
  const topic = "apps";
  const payload = {
    notification: {
      title: "Programstatus uppdaterad",
      body: notificationContent
    }
  };
  const options = {
    priority: "high",
    timeToLive: 60 * 60 * 24
  };

  // 必须返回Promise以告知Cloud Functions执行完成状态
  return admin.messaging().sendToTopic(topic, payload, options)
    .then(response => {
      console.log("Lyckades skicka meddelande:", response);
      return null;
    })
    .catch(error => {
      console.log("Fel vid försök att skicka meddelande:", error);
      return null;
    });
});

关键修改说明

  1. 参数结构更新:把触发器参数从event改为(change, context),适配新版SDK的标准写法。
  2. 正确获取路径参数:用context.params.appar读取路径中{appar}占位符对应的值。
  3. 数据快照的正确使用:通过change.after.val()获取更新后的数据,change.before可获取更新前的数据(如果有需要)。
  4. 函数返回值规范:确保函数返回Promise或有效值,避免Cloud Functions出现超时或未处理Promise的警告。
  5. 初始化简化:新版SDK中admin.initializeApp()无需传入functions.config().firebase,会自动完成初始化。

修改后你就能正常获取应用名称,并将其加入到推送通知内容中了。

内容的提问来源于stack exchange,提问作者Anton Sundqvist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:43