Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

snap.data is not a function in onUpdate

I have two functions that trigger onCreate and onUpdate however, the {uid} in onUpdate is returning undefined, whilst onCreate returns the {uid}.

How can I get the {uid} to work for onUpdate?

onUpdate.f.js - {uid} is undefined

exports = module.exports = functions.firestore
  .document('users/{uid}/alerts/{name}') //UID is the User ID value stored in alerts
  .onUpdate(snap => {
    const user = snap.data();
    console.log(user);
    const msg = {
      to: user.email,
      from: '[email protected]',
      templateId: user.template,
      dynamic_template_data: {
        firstName: user.firstName,
        email: user.email,
        id: user.uid
      }
    };
    return sgMail.send(msg).catch(err => console.log(`${user.email} - ${err}`));
  });

onCreate.f.js - {uid} is correct

exports = module.exports = functions.firestore
  .document('users/{uid}/alerts/{name}')
  .onCreate(snap => {
    const user = snap.data();
    console.log(user);
    const msg = {
      to: user.email,
      from: '[email protected]',
      templateId: user.template,
      dynamic_template_data: {
        firstName: user.firstName,
        email: user.email,
        id: user.uid
      }
    };
    return sgMail.send(msg).catch(err => console.log(`${user.email} - ${err}`));
  });

Fields in doc Alerts from frontend

doCreateAlert = (id, email, firstName, lastName, alertType, transactionEmailId) => {
const db = this.firestore;
return db.doc(`users/${id}/alerts/${alertType}`).set({
    uid: id,
    name: alertType,
    email: email,
    firstName: firstName,
    lastName: lastName,
    template: transactionEmailId,
    dateCreated: new Date(),
    dateModified: new Date()
  });
};

The onUpdate is triggered by updating the database with onClick={this.updateAlert} as

updateAlert = () => {
    const { firebase, userID } = this.props;
    const companyTypeSetup = db.doc(`users/${userID}/alerts/emailVerified`);
    companyTypeSetup.update({
      dateModified: new Date()
    });
  };

on the frontend I receive the error of

Uncaught (in promise) Error: No document to update: projects/app/databases/(default)/documents/users/undefined/alerts/emailVerified

and the function is never run. If I manually update the doc in Firestore, I get an error in the firebase functions log as

TypeError: snap.data is not a function
at module.exports.functions.firestore.document.onUpdate.snap (/user_code/lib/auth/onUpdate.f.js:17:23)
at cloudFunctionNewSignature (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:105:23)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:135:20)
at /var/tmp/worker/worker.js:754:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
like image 683
Darren Avatar asked Dec 10 '22 04:12

Darren


1 Answers

As the guide shows, onUpdate has two parameters: change and context. You use change since you may want to access the value before the update or after the update. Assuming you want the value after the update, that would look like this:

exports = module.exports = functions.firestore
  .document('users/{uid}/alerts/{name}') //UID is the User ID value stored in alerts
  .onUpdate((change, context) => {
    const user = change.after.data();
    console.log(user);
    const msg = {
      to: user.email,
      from: '[email protected]',
      templateId: user.template,
      dynamic_template_data: {
        firstName: user.firstName,
        email: user.email,
        id: user.uid
      }
    };
    return sgMail.send(msg).catch(err => console.log(`${user.email} - ${err}`));
  });
like image 151
Jen Person Avatar answered Jan 05 '23 17:01

Jen Person