Firestore 云功能 - 每次将文档添加到不同集合(而不是“用户”)时,我可以向用户发送电子邮件吗?

问题描述 投票:0回答:1

我对云功能非常陌生,但已经设置了几个 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
                })
        }
    });
javascript google-cloud-firestore google-cloud-functions
1个回答
0
投票

好吧,我修好了!! 我使用的代码已经差不多了,感谢 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);

希望它能帮助别人:

https://www.youtube.com/watch?v=vThujL5-fZQ

© www.soinside.com 2019 - 2024. All rights reserved.