Javascript 在Google云函数中更新change Firebase触发器中的ref
我有一个Javascript 在Google云函数中更新change Firebase触发器中的ref,javascript,firebase,firebase-realtime-database,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个消息条目,如下所示: firbaseapp messages -KiG85eYMH7jfKph4bl3 created: 1492788734743 title: "title" message: "message" 我想在新条目添加到此列表时发送通知,以便 我添加了这个云函数: exports.sendMessageNotification = functions.database.ref('/messages/').onWrite(eve
消息
条目,如下所示:
firbaseapp
messages
-KiG85eYMH7jfKph4bl3
created: 1492788734743
title: "title"
message: "message"
我想在新条目添加到此列表时发送通知,以便
我添加了这个云函数:
exports.sendMessageNotification = functions.database.ref('/messages/').onWrite(event => {
event.data.forEach(message => {
if (message.val().notificationSent) {
return;
}
admin.messaging().sendToTopic(...)
.then(res => {
return db.ref('/messages').child(message.key).update({
notificationSent: (new Date()).getTime(),
});
})
});
});
问题是message。key
是messages-KiG85eYMH7jfKph4bl3
,因此当我尝试保存它时,它会创建一个新条目,而不是更新现有条目:
firbaseapp
messages
-KiG85eYMH7jfKph4bl3
created: 1492788734743
title: "title"
message: "message"
-messages-KiG85eYMH7jfKph4bl3
notificationSent: 123434554534
我想要的是在现有条目上设置notificationSent
我还尝试使用message.ref
,但得到了相同的结果
那么,在云功能中更新firebase中的列表项的最佳方式是什么?我认为这就完成了您想要做的事情,并回答了您在评论中提出的问题:
exports.sendMessageNotification = functions.database.ref('/messages/{messageId}')
.onWrite(event => {
const messageId = event.params.messageId;
console.log('messageId=', messageId);
if (event.data.current.child('notificationSent').val()) {
console.log('already sent');
return;
}
const ref = event.data.ref; // OR event.data.adminRef
admin.messaging().sendToTopic(...)
.then(res => {
return ref.update({
// Caution: this update will cause onWrite() to fire again
notificationSent: (new Date()).getTime(),
});
})
});
你为什么不能简单地触发
/messages/{messageId}
?所以functions.database.ref('/messages/{messageId}')
。消息id是由firebase在调用push()
时生成的,所以问题是-如何从更改中获取消息id?const messageId=event.params.messageId
获取ref-path通配符我刚刚得到了您的两个答案。如果我监听/messages/{messageId}
是否有任何方法可以从事件中获取ref,或者是否需要使用db.ref('/messages').child(event.params.messageId)构建它代码>?