热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Firebase数据库onWrite的云功能触发两次

如何解决《Firebase数据库onWrite的云功能触发两次》经验,为你挑选了1个好方法。

嗨我正在开发一个通知系统,但是我在删除已处理的通知数据时遇到问题.该onWrite事件监听器被触发两次导致两个通知.

你能帮我找一个解决方法,以便onWrite事件监听器不应该被触发两次吗?删除已处理的数据非常重要.

exports.sendMessageNotification = functions.database.ref('/notification/message/{recipientUid}/{senderUid}').onWrite(event => {
/* processing notification and sends FCM */

return admin.messaging().sendToDevice(tokens, payload).then(respOnse=> {
      // For each message check if there was an error.
      const toRemove = [];
      response.results.forEach((result, index) => {
        const error = result.error;
        if (error) {
          console.error('Failure sending notification to', tokens[index], error);
          // Cleanup the tokens who are not registered anymore.
          if (error.code === 'messaging/invalid-registration-token' ||
              error.code === 'messaging/registration-token-not-registered') {
            toRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
          }
        }
      });

      //Deletes processed notification
      console.log("Removing notification");
      const getNotificatiOnPromise= admin.database().ref(`/notification/message/${recipientUid}/${senderUid}`).once('value');
      return Promise.all([getNotificationPromise]).then(results => {
        const notificatiOnSnapshot= results[0];
        toRemove.push(notificationSnapshot.ref.remove());

        console.log("Removing tokens.")
        return Promise.all(toRemove);
      });
      //return Promise.all(tokensToRemove);
    });
});

})

Doug Stevens.. 6

这是一个常见的错误.您正在写回到首次触发函数时匹配的相同数据库位置(通过删除数据).这意味着删除将再次触发该功能以处理第二次更改.这是目前的预期行为.

您需要想出一种方法来检测第二次写入是为了响应数据的删除.此外,您目前在功能方面做了太多工作.没有必要读取数据库的值'/notification/message/{recipientUid}/{senderUid}'- 它已经在传递给函数的事件中传递给您.请务必阅读有关数据库触发器的文档.您可以通过检查事件数据来知道该函数是否第二次被触发,如果它为null则可以提前返回,这意味着它已被删除.

此外,如果您正在处理单个承诺,则不需要Promise.all().只需在单个promise上使用then()继续处理,或从then()返回单个promise.

您可能希望查看一些显示数据库触发器的示例代码.



1> Doug Stevens..:

这是一个常见的错误.您正在写回到首次触发函数时匹配的相同数据库位置(通过删除数据).这意味着删除将再次触发该功能以处理第二次更改.这是目前的预期行为.

您需要想出一种方法来检测第二次写入是为了响应数据的删除.此外,您目前在功能方面做了太多工作.没有必要读取数据库的值'/notification/message/{recipientUid}/{senderUid}'- 它已经在传递给函数的事件中传递给您.请务必阅读有关数据库触发器的文档.您可以通过检查事件数据来知道该函数是否第二次被触发,如果它为null则可以提前返回,这意味着它已被删除.

此外,如果您正在处理单个承诺,则不需要Promise.all().只需在单个promise上使用then()继续处理,或从then()返回单个promise.

您可能希望查看一些显示数据库触发器的示例代码.


这个答案帮助我了解到我可以通过`const data = event.data;`来获取数据快照,并在函数内部添加一个if,如果没有值,则返回`if(data == undefined ||!data.val() ){return;}`
推荐阅读
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了当应用程序处于后台状态时,FCM多次推送通知无法正常工作相关的知识,希望对你有一定的参考价值。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • node.js中需要遍历数组并返回值的处理实在是搞不懂了... ... [详细]
  • 使用Node.js进行数据库操作和身份认证的方法:Session和JWT
    文章目录数据库和身份认证Node操作mysql配置mysql模块操作mysql数据库Web开发模式服务端渲染前后端分离如何选择身份认证Session认证机制Session工作原理E ... [详细]
  • NB:我看到我的草稿中已有将近两年的教程,所以我决定将其发布。在本教程中,我将构建一个简单的reactJs应用程序,该应用程 ... [详细]
  • 请问这样做有什么意义吗?{//_comment1:Somebrowserswillusethistoenablepushnotifications. ... [详细]
  • MAKER:Technovation/译:趣无尽Cherry(转载请注明出处)本次介绍的是一个由树莓派驱动的物联网滴灌系统,比往期《用树莓 ... [详细]
author-avatar
炎木柏玮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有