2013-11-01 18 views
1

我正在构建网站联系表单。我通过Angular js将表单提交内容添加到Firebase中。当新的提交被提交给Firebase时,我在Node中使用child_added来触发nodemailer。这工作正常,除了整个提交集合正在重新发送电子邮件,每当我重新启动开发服务器,并在Heroku生产每天多次。我如何确保电子邮件不会被多次发送?Firebase Child_Added成功触发Nodemailer但发送重复(在Heroku上托管)

var myRoot = new Firebase('https://firebase.firebaseio.com/website/submissions'); 

myRoot.on('child_added', function(snapshot) { 
    var userData = snapshot.val(); 
    var smtpTransport = nodemailer.createTransport("SMTP",{ 
     auth: { 
      user: "[email protected]", 
      pass: "password" 
     } 
    }); 

var mailOptions = { 
    from: "Website <[email protected]>", // sender address 
    to: "[email protected]", // list of receivers 
    subject: "New Website Lead", // Subject line 
    html: "<p><strong>Name: </strong>" + userData.name + "</p>" + "<p><strong>Email: </strong>" + userData.email + "</p>" + "<p><strong>Phone: </strong>" + userData.phone + "</p>" + "<p><strong>Enquiry: </strong>" + userData.enquiry + "</p>" + "<p><strong>Submitted: </strong>" + userData.date + "</p>" // html body 
}; 

smtpTransport.sendMail(mailOptions, function(error, response) { 
    if(error) { 
     console.log(error); 
    } 
    else { 
     console.log("Message sent: " + response.message); 
    } 
    smtpTransport.close(); 
    }); 
}); 

回答

1

'child_added'事件可能不是一个很好的选择。该事件并不意味着孩子刚刚被添加到Firebase的某些收藏中;当您的ref有子对象时,它会触发Firebase中的每个加载的子项,此外还会触发新添加子项时的触发。因此,每次加载该集合(例如,当您重新启动服务器时),都会为加载的每个子进程调用邮件程序(因此会导致重复)。

当您添加新的提交时,您可能会更好地发送传统的http请求来触发角度动作中的邮件程序。

我想你可以添加字段指示是否孩子已经寄出,只有邮件的孩子,一直没上'child_added'事件。但这对我来说似乎不够雅致。

1

每次添加一个孩子时,将孩子移动到您的火力点的不同分支(或者,如果您不需要记录事件,就直接删除孩子)。

on('child_added', function(oldSnap) { 
    eventHistoryRef.push(oldSnap.val()); 
    oldSnap.ref().remove(); 
    // use nodemailer 
});