一旦生成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,它将不会按照你期望的方式运行。