【问题标题】:Parse AfterSave trigger going in a loop解析 AfterSave 触发器进入循环
【发布时间】:2020-02-21 09:30:50
【问题描述】:

我的 aftersave 处理程序有问题。因此,当新用户登录时,它会检查 tProfile 和 sProfile 字段是否为空,如果是,它会为用户保存 acl,然后使用 nodemailer nmp 包向用户发送电子邮件。但是在保存用户后,服务器会继续循环发送电子邮件,发送了大约 64 封电子邮件,之后谷歌阻止了登录尝试,非常感谢您的帮助。我的云代码如下

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

【问题讨论】:

  • 很明显,如果你尝试保存在 afterSave 中,这将是一个递归函数。如果你想修改用户数据,你应该使用 beforeSave。
  • 所以从你的意思来看,我定义的任何 aftersave 处理程序都是递归的?我的目标是在新用户注册后向他们发送一封电子邮件,如果没有 aftersave 怎么办?从客户端注册后,我不想调用另一个 cloudcode 函数。我想在他们注册后立即发送一封电子邮件,这只能通过云代码实现,我不能在保存之前使用,因为在注册处理程序之前没有
  • 而且我不明白为什么 aftersave 是递归的,每次保存用户类时不应该在 save 后调用一次吗?还是继续运行?
  • 它是递归的,因为您正在为 User 类定义保存事件的触发器,因此如果您在触发器中调用保存函数,它将是一个无限循环。使用 afterSave 您可以查询相同的类或保存不同类的操作。如果您在 beforeSave 中检查您的用户是否存在,您可以向新用户发送电子邮件。
  • 哦,天哪,非常感谢,我现在觉得自己很笨。

标签: javascript node.js parse-platform parse-cloud-code back4app


【解决方案1】:

如果您尝试在 afterSave 中保存相同的类对象,它将是递归函数。

你可以使用 beforeSave 触发器

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

【讨论】:

猜你喜欢
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多