我想创建一个firebase函数,当表中有新条目时会触发通知。 我有一个单独的表,其中包含所有设备令牌。无法弄清楚如何从表中获取每个设备令牌。 这是我迄今为止写过的一些firebase函数的代码片段,但没有运气。
'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotificationToAllMembers = functions.database.ref('/chatRoom/{messageNode}').onWrite(event => {
const messageInfo = event.params.messageNode;
// Get the list of device notification tokens.
const getDeviceTokensPromise = admin.database().ref(`/deviceTokens`).once('value');
// Get newly added Message detail
const getMovieMessageDetail = admin.database().ref(`/chatRoom/${messageInfo}`).once('value');
return Promise.all([getDeviceTokensPromise, getMovieMessageDetail]).then(results => {
const deviceTokensList = results[0];
const MessageDetail = results[1];
console.log('device tokens : ',deviceTokensList);
console.log('Fetched message detail', MessageDetail);
// Check if there are any device tokens.
if (!deviceTokensList.hasChildren()) {
return console.log('There are no notification tokens to send to.');
}
console.log('There are', deviceTokensList.numChildren(), 'tokens to send notifications to.');
// Notification details.
const payload = {
notification: {
title: 'New Movie discussion',
body: `${MessageDetail.messageText}`,
}
};
// Listing all tokens.
const tokens = Object.keys(deviceTokensList.val());
// Send notifications to all tokens.
return admin.messaging().sendToDevice(tokens, payload).then(response => {
// For each message check if there was an error.
const tokensToRemove = [];
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') {
tokensToRemove.push(deviceTokensList.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
});
});
以下是我所指的firebase实时数据库的快照, I.E.无论何时推送聊天室'表,我想向“deviceTokens'中存在的每个设备令牌发送通知。表。
提前感谢!!
答案 0 :(得分:0)
要么更改结构,要么保持不变,但是当您将数据发送到数据库时,请尝试使用set()。
db.ref("deviceTokens").set({[token] : token}).ref.child("tokenID").set(token);
但是,拥有更多用户并不能很好地解决此问题。
有了这个,它将读取令牌,并且用户将获得推送通知。
但是,set()是有限的,因此即使使用push()也会生成唯一的密钥
您可以尝试:
var firebaseRef = db.ref("deviceTokens").child(token).child("tokenId");
firebaseRef.set({
text : 'some other text field'
});
但是,我认为您必须具有唯一的令牌才能存储到数据库中?