javascript - 向循环 firebase 云功能中的所有电子邮件发送电子邮件

标签 javascript typescript firebase google-cloud-functions

我创建了一个云函数,它进入名为“properties”的 firebase 集合,然后进入名为“mid_tenancy”的特定属性中的子集合。在“mid_tenancy”的 id 中,我然后遍历租户的每个成员并访问他们的电子邮件。

但是,我遇到的问题是,电子邮件只发送到循环中的第一封电子邮件,而不是其他任何一封。这是我的数据库的样子:

enter image description here

出于显而易见的原因,我删除了这些电子邮件

这是我的云函数:

export const midTenancyEmail = functions.firestore
    .document('properties/{propertyId}/mid_tenancy/{midTenancyId}')
    .onCreate(event => {
        const propertyId = event.params.propertyId;
        const midTenancyId = event.params.midTenancyId;
        const db = admin.firestore();
        const propertyDoc = db.collection('properties').doc(propertyId);
        const midTenancyDoc = propertyDoc.collection('mid_tenancy').doc(midTenancyId);
        let mid_tenancy;

        return propertyDoc
            .get()
            .then(doc => {
                const property = doc.data();
                midTenancyDoc.get().then(data => {
                    mid_tenancy = data.data();
                  for(let tenant of mid_tenancy.mid_tenants) {
                    let msg = {
                        to: tenant.mid_tenant_email,
                        from: 'email',
                        // custom templates
                        subject: 'You have a new direct message',
                        templateId: 'id',
                        substitutionWrappers: ['{{', '}}'],
                        substitutions: {
                            name: tenant.mid_tenant_name,
                            message: tenant.status,
                        }
                    };
                    return sgMail.send(msg);
                  }
                })
            })
            .then(email => {
                console.log('email sent: ', email);
            })
            .catch(err => {
                console.log(err);
            })

    });

有人知道为什么只发送一封电子邮件吗?而不是循环中的所有电子邮件?在第一个循环之后似乎有什么东西打破了循环。

在循环之前我已经完成了:console.log(mid_tenancy.mid_tenants[1].mid_tenant_name 只是为了确保它可以访问,并且它确实记录了。

最佳答案

您需要将每个电子邮件任务推送到一个 promise 数组中,然后返回所有 promise return Promise.all(promises):

export const midTenancyEmail = functions.firestore
  .document('properties/{propertyId}/mid_tenancy/{midTenancyId}')
  .onCreate(event => {
    const propertyId = event.params.propertyId;
    const midTenancyId = event.params.midTenancyId;
    const db = admin.firestore();
    const propertyDoc = db.collection('properties').doc(propertyId);
    const midTenancyDoc = propertyDoc.collection('mid_tenancy').doc(midTenancyId);
    let mid_tenancy;
    return propertyDoc
      .get()
      .then(doc => {
        const property = doc.data();
        midTenancyDoc.get().then(data => {
          mid_tenancy = data.data();
          const promises = [];
          for (let tenant of mid_tenancy.mid_tenants) {
            let msg = {
              to: tenant.mid_tenant_email,
              from: 'email',
              // custom templates
              subject: 'You have a new direct message',
              templateId: 'id',
              substitutionWrappers: ['{{', '}}'],
              substitutions: {
                name: tenant.mid_tenant_name,
                message: tenant.status,
              }
            };
            promises.push(sgMail.send(msg)) ;
          }
          return Promise.all(promises);
        });
        return null;
      })
      .catch(err => {
        console.log(err);
      });
  });

关于javascript - 向循环 firebase 云功能中的所有电子邮件发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51286039/

相关文章:

javascript - 如何在 typescript 中将新的接口(interface)类型插入数组

ios - Firebase - .value 上的索引未给出排序结果

javascript - ReactJS:如果在 promise 解决后经过身份验证,则呈现私有(private)路由

javascript - Onsen 在同一页面上使用导航器和侧边栏

javascript - 如何使用 (PHP)foreach 使用数据库中的记录更新我的 javascript 时间表?

ios - 如何在 iOS objective-c 中将 firebase 时间戳转换为日期?

ios - 尝试找出从 Firestore 字典中删除元素的更好方法

javascript - React 路由器和 Express GET 冲突

javascript - 监听 Angular 对象更新的变化

reactjs - 使用 axios 拦截器和响应时出错