- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
您好,我正在开发一个通知系统,但我无法删除已处理的通知数据。 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);
});
});
})
最佳答案
这是一个常见的错误。您正在写回到函数首次触发时匹配的同一数据库位置(通过删除数据)。这意味着删除将再次触发该功能以处理第二次更改。这是目前预期的行为。
您需要想出一种方法来检测第二次写入是为了响应数据删除而发生的。另外,你目前在你的职能上做了太多的工作。无需在 '/notification/message/{recipientUid}/{senderUid}'
处读取数据库的值 - 它已经在传递给函数的事件中传递给您。务必read the docs about database triggers .您可以通过检查事件数据并提前返回(如果为 null,这意味着它已被删除)来了解该函数是否被第二次触发。
此外,如果您正在处理单个 promise ,则不需要 Promise.all() 。只需对单个 promise 使用 then() 以继续处理,或从 then() 返回单个 promise 。
您可能想查看一些 sample code显示数据库触发器。
关于node.js - Cloud Functions for Firebase 数据库 onWrite 触发了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43131416/
我正在使用 Firebase Cloud Function 在实时数据库触发事件时发送 FCM。如何获取 {followerUid} 中子项 ('uid') 的值? exports.sendFollo
我阅读了所有关于此问题的答案,但仍然存在一些问题。可能是 .ref() 的问题,但我看不出我做错了什么。我的云功能根本没有触发。 数据库示例:业务/{businessId}/reservations/
当函数正在监听顶级文档时,子集合中的更改是否可以触发 Firebase 函数?如果不是, documentation 的通配符示例中的第一行是什么?意思是? 这是什么意思???如果子集合发生变化会触发
我正在查看 Firebase 的新云功能,它说在执行 OnWrite 时,您应该小心,不要将数据保存回同一个子项。 (这将再次触发触发器)。 所以我想弄清楚,如何在记录上设置修改日期? 最佳答案 问题
我部署了一个简单的 Firebase 函数,如下所示,这是我从 Google 开发人员那里学到的。它的简单目的是每当有人将 1111 写入数据库中的“值”字段时将其更改为某些文本,但我的问题是此函数仅
这个问题已经有答案了: Firebase functions: cannot read property 'user_id' of undefined (1 个回答) 已关闭 5 年前。 我希望为 f
exports.editData = functions.database.ref('/AllData/hello/A').onWrite((change, context) => { con
我有一个 TextView,我想控制用户何时插入字母。 Ex. s -> search s in database and show results st -> search st in databa
我正在尝试在本地测试我的云功能。我正在使用命令 firebasefunctions:shell 成功启动模拟器。我的 index.ts 中有以下云函数: export const stripeChar
好的,我看过类似的问题,例如 Firebase function onWrite not being called并认为获取引用是我的错,但我不知道我的 Firebase 函数发生了什么。 我只是想在
我正在尝试使用 Firebase Functions 实现触发器,它会复制数据库中的一些数据。我想在votes/user/vote观看所有添加,结构是: 我试过的代码是: const function
我想在 firebase 上添加的节点上执行云功能,并在功能结束后将其删除。 then((event)=>event.remove()) 在以下代码中不起作用。 const admin = requi
我想到的是,当我通过SendBuf()将字节直接写入套接字连接时,ClientSocket的onWrite事件是多余的。 我的想法是在沙漠中的某个地方吗? Delphi文档也很糟糕,因为它只是说:“为
我有一个 oncreate 函数,当我在实时数据库中创建数据时,该函数似乎没有触发。我了解 onCreate 在实时数据库中创建新数据时使用。请参阅下面的代码。 我做错了什么? exports.get
我正在尝试运行云函数并更改数据库上的值,但每次我返回带有或不带有“firebase-admin”模块的 promise 时,函数都会在 60 秒后超时。 这是我的代码: var functions =
我正在尝试编写一个 firebase 函数,它将检查“用户”并根据数据库写入事件进行行为。但是,当我查询数据库时,它每次都返回 null,而且我不知道我做错了什么。如有任何帮助,我们将不胜感激。 提前
在 Firebase 函数文档中提到了这一点 event.data.ref.parent 在 Before (= v1.0.0) 但这会返回一个未定义的 onWrite(snap, context)
我正在尝试制作一个简单的消息应用程序。在此过程中,我想使用firebase的云函数功能来执行出于安全考虑而不应在客户端执行的功能。 我希望在用户需要时调用许多函数。我现在尝试执行此操作的方法是让客户端
我返回交易 promise ,它应该在停止功能之前等待交易完成。事务执行得很好,但 promise 似乎永远不会解决。 我在 Firebase 控制台中看到这个函数总是在 60 秒后超时。 const
我正在用 onWrite 触发一个云函数。在 onWrite 函数中,我想对写入的文档的 ref ID 做一些事情。我怎么能捕获这个?我当前的代码看起来像这样,但我不知道如何填充 eventID。 e
我是一名优秀的程序员,十分优秀!