我正在建立一个网站联系表格。我已经通过Angular js将表单提交添加到Firebase。当新的提交提交给Firebase时,我在Node中使用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@gmail.com",
pass: "password"
}
});
var mailOptions = {
from: "Website <email@gmail.com>", // sender address
to: "email@email.com.au", // 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();
});
});
答案 0 :(得分:1)
'child_added'
事件可能不是一个很好的选择。该事件并不意味着刚刚将一个孩子添加到Firebase中的某个集合中;除了在新添加子项时触发,当ref
具有子对象时,它会触发从Firebase 加载的每个孩子。因此,每次加载该集合时(例如,当您重新启动服务器时)都会为每个加载的子项调用邮件程序(因此复制)。
在添加新提交时,您最好发送传统的http请求以从角度操作中触发邮件程序。
我认为你可以添加一个字段,表明孩子是否已经邮寄过,并且只邮寄未参加'child_added'
事件的孩子。但这对我来说似乎不太优雅。
答案 1 :(得分:1)
每次添加孩子时,请将孩子移到火力架的不同分支(或者如果您不需要记录事件,则只需删除孩子)。
on('child_added', function(oldSnap) {
eventHistoryRef.push(oldSnap.val());
oldSnap.ref().remove();
// use nodemailer
});