firebase函数触发通知

时间:2017-10-03 21:11:48

标签: android node.js firebase firebase-realtime-database firebase-cloud-messaging

我想创建一个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'中存在的每个设备令牌发送通知。表。 firebase real-time database snapshot

提前感谢!!

1 个答案:

答案 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'
});

但是,我认为您必须具有唯一的令牌才能存储到数据库中?