我对云功能非常陌生,但已经设置了几个 Firestore 云功能,并让它们在创建或更新用户文档时向个人发送电子邮件,但我真的想在添加文档时向每个用户发送电子邮件到另一个集合(这是一个显示视频的反应应用程序 - 我想在添加新视频时更新所有订阅的用户)。 如有必要,我可以重组数据库,但它目前只有用户和视频作为唯一的 2 个根级别集合。
我尝试对用户集合使用 .get() 来收集他们的所有电子邮件地址,并将其放入电子邮件的“收件人”字段中,但我只是收到一条错误消息,提示“db.get() 不是函数” 。 经过研究,我发现了一些可以尝试的方法,但都遇到了相同的错误:
functions.firestore
.document('users/{uid}').get()
.then((querySnapshot) => {
和
const admin = require('firebase-admin');
var db = admin.firestore();
db.document('users/{uid}').get()
.then((querySnapshot) => {
有人可以帮忙吗? 可以这样做吗? 理论上,新的电子邮件触发扩展可能会做到这一点,但说实话,我宁愿自己编码并学习它是如何工作的 - 特别是“破解”前两个!但我找不到任何方法来访问一个函数中两个集合的内容&我花了几天时间在所有常用位置查找任何信息,所以我开始认为云函数可能只能访问每个函数的一个集合- 但我也找不到任何实际说明的内容......?
这是使用我为其他 2 个函数工作的格式的整个函数(除了尝试访问用户):
const functions = require('firebase-functions');
const nodemailer = require('nodemailer');
const admin = require('firebase-admin');
var db = admin.firestore();
//google account credentials used to send email
var transporter = nodemailer.createTransport({
host: process.env.HOST,
port: 465,
secure: true,
auth: {
user: process.env.USER_EMAIL,
pass: process.env.USER_PASSWORD,
}
});
//Creating a Firebase Cloud Function
exports.sendNewVidEmail = functions.firestore
.document('videos{uid}')
.onCreate(async (snap, context) => {
const newValue = snap.data();
// access title & description
const newVideoTitle = newValue.title;
const newVideoDescription = newValue.description;
//try to access users
db.document('users/{uid}').get()
.then((querySnapshot) => {
let users = [];
querySnapshot.forEach((doc) => {
// check for data
console.log(doc.id, " => ", doc.data());
users.push(doc.data().subscriberEmail)
//check for 'users' array
console.log('users = ', users)
});
})
.catch((error) => {
console.log("Error getting documents: ", error);
});
// perform desired operations ...
if (newVideoTitle) {
const mailOptions = {
from: process.env.USER_EMAIL,
to: users,
subject: 'new video!',
html: `
<h2> xxx has a new video called ${newVideoTitle}</h2>
<p> xxx says this about ${newVideoTitle}: ${newVideoDescription}.
</p></ br>
<h4>Watch ${newVideoTitle} <a href="xxx" target="_blank">here.</a>and please tick 'like' if you like it!</h4>
<p>Yours,</p>
<p>xxx :-) </p>`
};
return transporter.sendMail(mailOptions)
.then(() => {
console.log('sent')
})
.catch(error => {
console.log(error)
return
})
}
});
好吧,我修好了!! 我使用的代码已经差不多了,感谢 Jeff Delaney (fireship) [这里][1] 提供的精彩 YouTube 教程,我得到了我需要的代码。 2 行,如此简单,现在我正在踢自己,但为了防止其他人陷入困境,我的错误是尝试使用
.forEach()
(来自文档)和 .push()
来获取用户的电子邮件数组当仅在快照上使用 .map()
时,可以完美创建用户数组,然后就可以了!
const userSnapshots = await admin.firestore().collection('users').get();
const emails = userSnapshots.docs.map(snap => snap.data().subscriberEmail);
希望它能帮助别人: