Firebase Child_Added成功触发Nodemailer但发送重复项(托管在Heroku上)

时间:2013-11-01 01:55:06

标签: heroku firebase nodemailer

我正在建立一个网站联系表格。我已经通过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();
    });
});

2 个答案:

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