0

Ich versuche, Code zu implementieren, der eine E-Mail an jeden sendet, der sich für meinen Newsletter anmelden möchte. Der Code funktioniert tatsächlich, aber es sendet mehrere Duplikate. Ich benutze Firebase 'Beispielcode, so.Cloud-Funktion für Firebase: E-Mail-Duplikate

ich glaube, das Problem ist, dass es für listensens jede Änderung auf der {uid} und ich bin Einstellung 4 Werte. Wenn ich irgendetwas manuell in der Datenbank über das Dashboard ändere, löst es das Ereignis aus und sendet eine neue Mail. Mein Code:

'use strict'; 

const functions = require('firebase-functions'); 
const nodemailer = require('nodemailer'); 

// Configure the email transport using the default SMTP transport and a GMail account. 
// For other types of transports such as Sendgrid see https://nodemailer.com/transports/ 
// TODO: Configure the `gmail.email` and `gmail.password` Google Cloud environment variables. 

const gmailEmail = encodeURIComponent(functions.config().gmail.email); 
const gmailPassword = encodeURIComponent(functions.config().gmail.password); 
const mailTransport = nodemailer.createTransport(
    `smtps://${gmailEmail}:${gmailPassword}@smtp.gmail.com`); 

// Sends an email confirmation when a user changes his mailing list subscription. 
exports.sendEmailConfirmation = functions.database.ref('/mailingList/{uid}').onWrite(event => { 
    const snapshot = event.data; 
    const val = snapshot.val(); 

    if (!snapshot.changed('subscribed')) { 
    return; 
    } 

    const mailOptions = { 
    from: '"Spammy Corp." <[email protected]>', 
    to: val.email 
    }; 

    // The user just subscribed to our newsletter. 
    if (val.subscribed == true) { 
     mailOptions.subject = 'Thanks and Welcome!'; 
     mailOptions.text = 'Thanks you for subscribing to our newsletter. You will receive our next weekly newsletter.'; 
     return mailTransport.sendMail(mailOptions).then(() => { 
     console.log('New subscription confirmation email sent to:', val.email); 
    }); 
    } 
}); 

Antwort

1

Ein Datenbank-Trigger wird Lauf für jeden auf den Weg vorgenommene Änderung ist es Überwachung, und Sie müssen dafür planen. In Ihrer Funktion müssen Sie herausfinden, ob die E-Mail bereits versendet wurde. Die typische Lösung besteht darin, einen booleschen Wert oder einen anderen Flag-Wert in den Knoten zurückzuschreiben, der die Änderung ausgelöst hat, und dann jedes Mal nach diesem Wert zu suchen und früh zurückzukehren, wenn er gesetzt ist.