How to trigger firestore cloud functions on update of field value?

扶醉桌前 提交于 2020-01-23 11:42:34

问题


I want to send email to user on update of status field of user to value (true) using firestore and cloud functions.

My case : I have a users(collections) which has more documents of userId(documents) and each document contains field and value. One of the field is status: true | false (boolean).

I want to send email to that user if status of that user change to true using cloud functions and sendgrid api.

users
   - dOpjjsjssdsk2121j131
        - id : dOpjjsjssdsk2121j131
        - status : false
   - pspjjsjssdsdsk2121j131
        - id : pspjjsjssdsdsk2121j131
        - status : false
   - yspjjsjssdsdsk2121j131
        - id : yspjjsjssdsdsk2121j131
        - status : false


const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const SENDGRID_API_KEY = functions.config().sendgrid.key;
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SENDGRID_API_KEY);
exports.sendEmail = functions.firestore.document('users/{userId}')
  .onUpdate((change, context) => {  
   const after = change.after.val();

    if(after.status === 'VERIFIED'){
      console.log('profile verified')
      const db = admin.firestore();

      return db.collection('users').doc(userId)
      .get()
      .then(doc => {
         const user = doc.data();
         const msg = {
           to: 'email',
           from: 'email',
           templateId: 'template id',
           dynamic_template_data: {
            subject: 'Profile verified',
            name: 'name',
        },
       };

       return sgMail.send(msg)
   })
   .then(() => console.log('email sent!') )
   .catch(err => console.log(err) )

    } 

  });

回答1:


You are getting your error because in Firestore where is no val().

Try to change your change.after.val() to change.after.data(), so your code looks like this:

exports.sendEmail = functions.firestore.document('users/{userId}')
  .onUpdate((change, context) => {  
   const after = change.after.data();

    if(after.status === 'VERIFIED'){
      console.log('profile verified')
      const db = admin.firestore();


      return db.collection('users').doc(userId)  // get userId
      .get()
      .then(doc => {
         const user = doc.data();
         const msg = {
           to: 'email',
           from: 'email',
           templateId: 'template id',
           dynamic_template_data: {
            subject: 'Profile verified',
            name: 'name',
        },
       };
       return sgMail.send(msg)
   })
   .then(() => console.log('email sent!') )
   .catch(err => console.log(err) )
    } 
  });


来源:https://stackoverflow.com/questions/57818168/how-to-trigger-firestore-cloud-functions-on-update-of-field-value

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!