通过循环Firebase云功能向所有电子邮件发送电子邮件

时间:2018-07-11 12:56:07

标签: javascript typescript firebase google-cloud-functions

我创建了一个云函数,该函数进入名为“属性”的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,只是为了确保它可以访问并且记录了日志。

2 个答案:

答案 0 :(得分:2)

在第一次迭代结束时,您将在for循环中返回

AND  (area like'%New york%' or area like'%Las vegas%')

这将导致for循环停止迭代。

答案 1 :(得分:2)

您需要将每个电子邮件任务推送到一组承诺中,然后返回所有承诺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);
      });
  });