Получение поля из одного документа Cloud Firestore для указания местоположения, в котором можно прослушивать изменения (или записи) в другой облачной функции - PullRequest
0 голосов
/ 09 января 2020

Я успешно использую облачную функцию Firebase в Typescript, чтобы отправлять пользователям уведомление при создании документа в коллекции Firestore.

Однако, поскольку я храню один и тот же документ в двух разных местах, он отправляет уведомления дважды. Я хочу, чтобы уведомление было отправлено только один раз.

Есть ли способ использовать другую облачную функцию, чтобы получить, скажем, текущего пользователя, а затем использовать ее в запросе к моей функции, которая отправляет уведомление, чтобы он только просматривал записи / чтения в изменениях, которые происходят для что указано c только для пользователя?

Вот мой код в облаке Функции:

export const notificationOnMessageReceived = 
functions.firestore
    .document('users/{uid}/matches/{match}/messages/{message}') //HOW CAN I GET UID FROM ANOTHER FUNCTION AND USE IT HERE TO SPECIFY EXACTLY THE USER FOR WHICH IT SHOULD RUN?
    .onCreate(async snapshot => {

        const message = snapshot.get('Message');

        const token = snapshot.get('Device token receiver'); 

        console.log('token: ' + token); 

        const payload = {
            notification: {
                title: `New message`,
                body: `${message}`
            }
        };

        return fcm.sendToDevice(token, payload);
    });

1 Ответ

2 голосов
/ 09 января 2020

Я вижу две возможности:

1. Запишите идентификатор автора в документах

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

Что-то вроде следующего:

export const notificationOnMessageReceived = 
functions.firestore
    .document('users/{uid}/matches/{match}/messages/{message}') 
    .onCreate(async (snapshot, context) => {

         const newValue = snapshot.data();
         const authorId = newValue.authorId;

         const pathUid = context.params.uid;

         if (authorId === pathUid) {

             //proceed with the notification

         } else {
            return null;
         }

    })

Конечно, это подразумевает, что каждый раз функция облака запускается один раз "ни за что". Что касается цены вызова функции Cloud, это допустимо.

2. Записать дополнительный документ в выделенную коллекцию

Таким образом, только один документ вызовет функцию Cloud, но недостатком, очевидно, является дополнительная запись. С точки зрения цены, это выше, чем предыдущее решение (на основе Blaze Plan , цены ). Вы можете регулярно запускать облачную функцию расписания, которая удаляет обработанные документы.


СТОРОНА ПРИМЕЧАНИЕ: Вы, очевидно, используете старую версию Firebase SDK для облачных функций, см. https://firebase.google.com/docs/functions/beta-v1-diff#cloud -firestore . Начиная с версии 1.0 SDK, параметр event для асинхронных функций Firestore устарел. Он был заменен двумя новыми параметрами: snapshot и context.

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