Firebase云功能中的Mailgun通过触发一次发送多次



一旦生成Cloud function数据,请尝试在Firebase Cloud function中运行该函数。实际上,我想通过添加events集合的数据来运行sendEmail但是这些事件发生了好几次而不是一次

我使用mailgun发送电子邮件。

exports.sendEmail = functions.firestore
.document("events/{eventId}")
.onCreate((snap, context) => {
const data = snap.data();
const { uid } = data;
usersRef.doc(uid).onSnapshot((user) => {
firestoreRef
.collection("followers")
.where("uid", "==", uid)
.get()
.then((snapshot) => {
snapshot.docs.map((snapshot) => {
const follower = snapshot.data();
mailgunClient.messages
.create("mg.xxxx.com", {
from: "Excited User <noreply@mg.xxxx.com>",
to: follower.email,
subject: Hello,
text: "test",
html: "<p>test</p>",
})
.then((msg) => console.log("msg", msg))
.catch((err) => console.log("error", err));
});
});
});       
}
return true;
}

如果您想一次执行Firstore查询,请不要使用onSnapshot。这为文档设置了一个侦听器,每当文档更改时就会触发该侦听器。您几乎肯定希望使用get(),它只执行一次查询。

此外,您不会返回在所有异步工作完成时解析的promise。这对于所有不是HTTP函数的云函数都是必需的。承诺是云功能如何知道何时可以安全地终止和清理所有工作,如文档中所述。get()返回一个promise,因此您应该将其与启动的异步工作的其他promise一起使用。如果你在函数中没有正确处理promise,它将不会按照你期望的方式运行。

相关内容

  • 没有找到相关文章

最新更新