Search code examples
javascriptnode.jsparse-platformparse-cloud-codeback4app

Parse AfterSave trigger going in a loop


I am having trouble with my aftersave handler. So when a new user logs in, it checks to see of both tProfile and sProfile fields are empty, if so it saves saves an acl for the user and then sends an email to the user using nodemailer nmp package. But after a user is saved the server keeps on sending email after email in a loop, there were about 64 emails sent after which google blocked out the login attemps, help would be very appreciated. My cloud code is given below

Parse.Cloud.afterSave(Parse.User, (request) => {
        const user = request.object;
        const t = user.get('tProfile');
        const s = user.get('sProfile');
        if (!t && !s) {
        user.setACL(new Parse.ACL(user));
        user.save(null,{ useMasterKey: true });
        sendWelcomeEmail(user.getUsername(),user.get('type'));
        return;
        }else{
            console.log("Condition Working");
            return;
        }
    });

const sendWelcomeEmail = (userName,type) => {
        var nodemailer = require('nodemailer');
        var transporter = nodemailer.createTransport({
          service: 'gmail',
          auth: {
            user: 'tanzim3421@gmail.com',
            pass: 'oyhlyk****ocvhaa'
          }
        });
        var mailOptions = {
          from: 'tutorbeargroup@gmail.com',
          to: userName,
          subject: 'Welcome to TutorBear',
          text: 'Dear '+type+', thankyou for signing up with us. If you have any questions please contact us at: 01726409161'
        };
        transporter.sendMail(mailOptions,(error, info)=>{
          if (error) {
            console.log(error);
          } else {
           console.log('Email sent: ' + info.response);
          }
        });
    }

Solution

  • If you try to save same class object in afterSave it will be recursive function.

    You can use beforeSave trigger

    Parse.Cloud.beforeSave(Parse.User,async(req)=>{
      let userObject = req.object;
      if(userObject.isNew()){
        //Your Logic
      }
    });