Функции Firebase Cloud: моментальный снимок ошибки типа.forEach не является функцией

#firebase #google-cloud-functions

#firebase #google-cloud-функции

Вопрос:

Я изо всех сил пытался понять, почему моя функция Firebase Cloud не работает.

Я удаляю зарезервированный номер в коллекции под названием «anglerNumbers», когда зарегистрировался новый пользователь и когда был создан документ этого пользователя. Я использую это на клиенте, чтобы убедиться, что зарезервированный номер не может быть использован дважды. Я следую документации здесь: https://firebase.google.com/docs/firestore/query-data/queries?authuser=0 (Используя Node.js )

Но я продолжаю получать ошибку: ошибка типа: моментальный снимок.forEach не является функцией

Вот функция:

 exports.newUser = functions.firestore.document('users/{userId}')
.onCreate((snap, context) => {
    const newUserNumber = snap.data().anglerNumber;
    const anglersRef = admin.firestore().collection('anglerNumbers');
    const snapshot = anglersRef.where('anglerNumber', '==', newUserNumber).get();
    if (snapshot.empty) {
        console.log('No matching documents.');
        return;
    }  
    snapshot.forEach(doc => {
        console.log(doc.id, '=>', doc.data());
        doc.delete();
    });
}) 
  

Он не регистрирует в консоли «Нет совпадающих документов». Итак, есть документы, но я не могу выполнить forEach, как указано в документации. Чего мне не хватает? Спасибо!

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

1. get() возвращает обещание. Сначала вам следует дождаться его разрешения.

Ответ №1:

в этой строке вашего кода:

 const snapshot = anglersRef.where('anglerNumber', '==', newUserNumber).get();
  

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

Либо используйте await, если это возможно в вашем контексте, либо используйте:

 anglersRef.where('anglerNumber', '==', newUserNumber).get().then((snapshot)=>{
   //do you processing
});
  

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

1. Спасибо! Метод .then не сработал, но я смог использовать упомянутую вами альтернативу async / await. Спасибо 🙂