Mailgun в Firebase Cloud Function отправлять несколько раз по триггеру один раз - PullRequest
0 голосов
/ 12 апреля 2020

Попробуйте запустить функцию в облачной функции Firebase, как только сгенерируются данные облачной функции. На самом деле, я хочу запустить sendEmail, вызванный добавлением данных коллекции events. Но события происходят несколько раз, а не один раз.

Я использую 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;
  }

1 Ответ

1 голос
/ 12 апреля 2020

Если вы хотите выполнить запрос Firstore один раз, не используйте onSnapshot. Это устанавливает слушателя на документе, который срабатывает при каждом изменении документа. Вы почти наверняка захотите использовать get() вместо этого, который выполняет запрос один раз.

Кроме того, вы не возвращаете обещание, которое разрешается, когда вся асинхронная работа завершена. Это требуется для всех облачных функций, которые не являются функциями HTTP. Обещание заключается в том, что Cloud Functions знает, когда безопасно завершить и очистить всю работу, как описано в документации . get() возвращает обещание, поэтому вы должны использовать его в дополнение к другим обещаниям для asyn c работы, которую вы запускаете. Если вы неправильно выполняете обещания в своей функции, они не будут вести себя так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...