Облачные функции Firestore Запрос вне триггерного события - PullRequest
0 голосов
/ 20 марта 2020

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

посмотреть

exports.newTicketNotification = functions.firestore
.document('tickets/{refNo}')
.onCreate(async (snap, context) => {

   //get user
   const user = snap.data().ticketOwnerUid

   // Here i tried to query a collection called fcmTokens(Where my fcmTokens are stored)
   // this returned no matching documents
   // but if i use this  db.collection('tickets').where('tickeOwnerUid', '==', user).get() it works 

    db.collection('fcmTokens').where('userUid', '==', user).get()
    .then(snapshot => {
      if (snapshot.empty) {
        console.log('No matching documents.');
        return;
      }  
      snapshot.forEach(doc => {
        console.log(doc.id, '=>', doc.data());
      });
    })
    .catch(err => {
      console.log('Error getting documents', err);
    });

});

Я использую это, чтобы я мог получить токен fcm устройства и отправить им уведомление. это правильный способ сделать это? или вы, ребята, можете порекомендовать лучший способ заранее спасибо Smile Я застрял на 2 дня: (

1 Ответ

0 голосов
/ 20 марта 2020

Обратите внимание, что вы используете async/await и then() вместе.

Должно работать следующее:

exports.newTicketNotification = functions.firestore
.document('tickets/{refNo}')
.onCreate((snap, context) => {   //Note that we have removed async

   const db = admin.firestore();

   //get user
   const user = snap.data().ticketOwnerUid

   // Here i tried to query a collection called fcmTokens(Where my fcmTokens are stored)
   // this returned no matching documents
   // but if i use this  db.collection('tickets').where('tickeOwnerUid', '==', user).get() it works 

    return db.collection('fcmTokens').where('userUid', '==', user).get()
    .then(snapshot => {
      if (snapshot.empty) {
        console.log('No matching documents.');
        return;
      }  
      snapshot.forEach(doc => {
        console.log(doc.id, '=>', doc.data());
        //If you plan to call asynchronous methods, you should probably use Promise.all
      });
      return;
    })
    .catch(err => {
      console.log('Error getting documents', err);
      return;
    });

});

Обратите внимание, как мы возвращаем цепочку обещаний, так как Облачная функция - фоновая. Я бы посоветовал вам посмотреть 3 видео о "JavaScript Promises" из серии видеороликов Firebase: https://firebase.google.com/docs/functions/video-series/, которые объясняют этот ключевой момент.

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