Firebase Listener для конкретного текста в ссылке - PullRequest
0 голосов
/ 10 ноября 2019

Firebase Event Listener. Я хочу выполнить, если данные говорят: «запрос о дружбе», а не только об изменении данных.

Я пытался найти слушателей. Я нашел: https://firebase.google.com/docs/database/admin/retrieve-data

Я чувствую, что я близко, но мне нужна помощь со спецификой.

exports.sendNotification = functions.database.ref('/Notifications/{user_id}/{notification_id}').onWrite((change, context) => {

   const user_id = context.params.user_id;
   const notification_id = context.params.notification_id;

   const deviceToken = admin.database().ref('/' + user_id +'/device_token').once('value');
   return deviceToken.then(result => {

    const token_id = result.val();

    const payload = {
     notification: {
      title: "Friend Request",
      body: "You've received a new Friend Request! <3",
      icon: "default"
     }
    };
   });

});

Мой код выполняется (как и ожидалось), как при записи, так и при удалении. Однако: есть ли способ вместо этого проверить, записано ли что-то конкретное в базу данных?

Имейте в виду меня, пришедшего из Java. Но что-то вроде:

functions.database.ref('/Notifications/{user_id}/{notification_id}/type("friend request")')
.onWrite((write, context) => {.....

Я хочу, чтобы слушатель, чтобы проверить, какой тип данных / уведомлений я пишу в базу данных. И затем выполнить соответственно.

С наилучшими пожеланиями.

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Вы можете ограничить время запуска облачной функции:

  1. по пути, по которому записываются данные, и
  2. по типу операции записи (создание, обновление, удаление), который выполняется.

Невозможно ограничить триггер облачных функций для записываемого содержимого.


Если необходимо выполнить фильтрацию содержимого,вы должны будете сделать это внутри кода своей облачной функции, как показывает ответ Рено.

В качестве альтернативы, вы можете рассмотреть возможность перемещения соответствующего значения в путь операции записи. Например, вы можете поместить все запросы на добавление в друзья в отдельный путь в вашей базе данных (например, "friend_requests"), а затем запускать облачную функцию только по этому пути.


Если вы хотите запускать только своиОблачная функция при написании нового запроса, а не при удалении, вы можете изменить свое объявление на onCreate:

exports.sendNotification = functions.database.ref('/Notifications/{user_id}/{notification_id}')
.onCreate((snapshot, context) => {
1 голос
/ 10 ноября 2019

Если я правильно понимаю, нужно сделать следующее, проверив значение type:

exports.sendNotification = functions.database.ref('/Notifications/{user_id}/{notification_id}').onWrite((change, context) => {

    const user_id = context.params.user_id;
    const notification_id = context.params.notification_id;

    const afterData = change.after.val();

    if (afterData.type === "friend request") {
        const deviceToken = admin.database().ref('/' + user_id + '/device_token').once('value');
        return deviceToken.then(result => {

            const token_id = result.val();

            const payload = {
                notification: {
                    title: "Friend Request",
                    body: "You've received a new Friend Request! <3",
                    icon: "default"
                }
            };

            //Here you need to return the promise returned by an asynchronous operation, probably return admin.messaging()....
        });
    } else {
        console.log("Not a friend request");
        return null;
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...