1
votes

I've been struggling to understand why my Firebase cloud function isn't working.

I'm deleting a reserved number in a collection called 'anglerNumbers' when a new user has registered and when that users' document has been created. I use this on the client to make sure a reserved number can't be used twice. I'm following the documentation here: https://firebase.google.com/docs/firestore/query-data/queries?authuser=0 (Using Node.js)

But I keep getting the Error: TypeError: snapshot.forEach is not a function

Here's the function:

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();
    });
}) 

It does not console log 'No matching documents'. So there are documents but I can't perform the forEach as indicated by the documentation. What am I missing? Thanks!

1
get() returns a promise. You should first wait for its resolution.Emil Gi

1 Answers

2
votes

in this line in your code:

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

You assume that get resolves immediately to a snapshot but in fact get() returns a promise that will resolve into a snap shot. You need to wait for this async function.

Either use await if that is possible in your context or use:

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