Облачная функция — onWrite не запускается при создании нового документа

#javascript #node.js #firebase #google-cloud-firestore #google-cloud-functions

#javascript #node.js #firebase #google-cloud-firestore #google-cloud-функции

Вопрос:

У меня есть коллекция «Пользователи», которая содержит список документов, каждый документ имеет пользовательский объект и вложенную коллекцию «Уведомления». всякий раз, когда пользователь получает новое уведомление, новый документ создается в уведомлениях его вложенной коллекции.

Триггер в облачной функции не запускается.

Вот моя структура Firestore:

Структура Firestore

И вот моя функция:

 let functions = require('firebase-functions');
let admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendNotification = functions.firestore.collection('Users/{userID}/Notifications/{notificationId}')//
    .onWrite(async (change,context) => {

        // get receiver ID
        const receiverId = context.params.userID;

        // get notification object
        const notificationObject = change.after.val();
        // get sender ID
        const senderUid = notificationObject.senderId;

        console.log('sending notification to: '   senderUid);

        if (senderUid === receiverId) {
            // this should never be called
            console.log('sender is the receiver.');
        }

        // receiver's token
        const getTokenPromise = await admin.firestore().collection('Users').doc(receiverId).once('value');
        const token = getTokenPromise.val().deviceToken;
        // sender user object
        const sender = await admin.firestore().collection('Users').doc(senderUid).once('value');

        const payload = {
            data: {
                senderName: sender.val().userName,
                senderPhoto: sender.val().userPhoto,
                object: JSON.stringify(notificationObject)
            }
        };

        try {
          const response = await admin.messaging().sendToDevice(token, payload);
          console.log("Successfully sent notification:", response);
        }
        catch (error) {
          console.log("Error sending notification:", error);
        }
    });
  

Что я делаю не так?

Комментарии:

1. Как вы проверяете, что он не запускается? Из журнала облачных функций? Я вижу одну потенциальную проблему (непроверенную): вы больше не можете передавать functions.config().firebase данные при инициализации. См. firebase.google.com/docs/functions /…

2. Спасибо за ваш ответ, Рено, я изменил инициализацию, но все еще не запущен. Я проверяю журналы и устанавливаю точку останова на стороне клиента (android) в методе onMessageReceived.

Ответ №1:

Вы должны объявить свою функцию с

 exports.sendNotification = functions.firestore.document('Users/{userID}/Notifications/{notificationId}')//
    .onWrite(async (change,context) => {...});
  

и не с

 exports.sendNotification = functions.firestore.collection('Users/{userID}/Notifications/{notificationId}')//
    .onWrite(async (change,context) => {...});
  

На самом деле облачные функции для Firestore запускаются на уровне документа. Более подробная информация здесь и здесь в документе.