Jaime
Jaime

Reputation: 894

Firebase Cloud Function not firing

I'm trying to run the following Cloud Function:

exports.getUserData = functions.firestore
  .document('UserData/{id}')
  .onWrite(async (snap, context) => {
    const uid = snap.data.id;
    let uData;
    console.log("onCreate called. uid="+uid);
    await admin.auth().getUser(uid)
  .then(function(userRecord) {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully fetched user data:', userRecord.toJSON());
    uData = userRecord.toJSON();
  })
  .catch(function(error) {
    console.log('Error fetching user data:', error);
  });

    await admin
      .firestore()
      .doc('UserData/${uid}')
      .set({
        userRecord : uData
      });

    return null;
  });

It gets deployed allright, as I can see it in the console. But adding/updating a doc in the collection simply does not trigger the function (nothing shows in log).

Upvotes: 1

Views: 81

Answers (2)

ajorquera
ajorquera

Reputation: 1309

A couple of things, as I see a few problems

  • Seems to me that you want to trigger this function every time there is a new UserData collection. If this is the case, you should use the trigger onCreate. onWrite gets triggered every time a doc is updated, created or deleted.

  • You function is creating an infinite loop if you use onWrite. You are updating collections which will triggered the same function, over and over.

  • First argument of the function is not a snapDoc, if you are using onWrite. Check the documentation

  • This part:

    await admin
      .firestore()
      .doc('UserData/${uid}')
      .set({
          userRecord : uData
      });
    

'UserData/${uid}' is a string not a template string. Use backtick ` not single quote '

  • As @renaud-tarnec said, use context.params to get the id parameter

Upvotes: 1

Renaud Tarnec
Renaud Tarnec

Reputation: 83191

It seems that by doing

exports.getUserData = functions.firestore
  .document('UserData/{id}')
  .onWrite(async (snap, context) => {

    const uid = snap.data.id;
    //...
  });

you want to assign to the uid variable the value of the {id} wildcard in the 'UserData/{id}'.

For that you should use the context Object, as follows:

const uid = context.params.id;

and as explained here in the doc.

Upvotes: 1

Related Questions