Использование onWrite Trigger для базы данных в реальном времени в функции Firebase - PullRequest
0 голосов
/ 09 мая 2020

Я разработал приложение для флаттера, используя серверную часть dart и firebase. Я хочу, чтобы запускался, когда пользователь создает, удаляет, или обновляет что-нибудь в базе данных. Разобрался в методах onCreate, onRemoved, и onUpdate . Я написал код javascript в облачной функции firebase. Мне нужно отправить уведомление, когда сработает триггер. Я не хочу использовать 3 разных триггера. Я хочу использовать только триггер onWrite.

Это моя база данных.

enter image description here

Есть четыре отдела, называемых comp, гражданские, избранные, и мех . Я хочу срабатывать, когда изменения базы данных происходят в одном триггере onWrite!

Мой первый вопрос: я хочу различать , было ли это создано, удалено или обновлено from onWrite триггер. Я знаю, что он сработает для всех трех событий. Но как его отличить?

Это мой код для onCreate ...

exports.noticeAddedComp = functions.database.ref('main/notices/comp/{id}').onCreate( async evt =>  {

var token = ['dxnfr3dq6_Y:APA91bHavtoP62l296qzVoBhzQJbMFA']
const payload = {
    notification:{
        title : 'Message from Cloud',
        body : 'This is your body',
        sound : 'default'
    },
    data:{
    message : 'Thi is new Push',
    click_action : 'FLUTTER_NOTIFICATION_CLICK',
    }
};
        await admin.messaging().sendToDevice(token,payload);

});

Вышеуказанный код работает. Но это для onCreate.

Мой второй вопрос: нужно ли мне писать четыре кода триггера onWrite для четырех отделов?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Вы можете использовать свойства change.before и change.after, чтобы определить, был ли узел создан, удален или обновлен в обработчике onWrite:

exports.noticeAddedComp = functions.database.ref('main/notices/comp/{id}')
.onWrite( async (change, context) =>  {
  if (!change.before.exists()) console.log("New node: "+change.after.key);
  if (!change.after.exists()) console.log("Deleted node: "+change.before.key);
  if (change.before.exists() && change.after.exists()) console.log("Updated node: "+change.after.key)
  ...
});

Вы можете прикрепить Облачная функция для всех отделов сразу, включив в свой путь еще один параметр:

exports.noticeAddedComp = functions.database.ref('main/notices/{dept}/{id}')
.onWrite( async (change, context) =>  {
  console.log("Triggered for department: "+context.params.dept);
  ...
})
0 голосов
/ 09 мая 2020

Вы можете проверить, является ли evt.after.data().property; нулевым или не существует, то есть он удален.

EDIT:

Сценарий, когда вы создаете что-то (документ или поле):

Создание поля означало бы, что поле в «до» вообще не существует, а в «после» оно существует, но может быть нулевым.

Сценарий при обновлении чего-либо

Поле в «до» не то же самое, что в «после».

...