क्लाउड फ़ंक्शन डेटा उत्पन्न होने के बाद फ़ंक्शन को फायरबेस क्लाउड फ़ंक्शन में चलाने का प्रयास करें। असल में, मैं events संग्रह के डेटा को जोड़कर ट्रिगर sendEmail चलाना चाहता हूं। लेकिन घटनाएँ एक बार नहीं कई बार घटित होती हैं।

मैं ईमेल भेजने के लिए 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;
  }
0
k10a 12 अप्रैल 2020, 09:59

1 उत्तर

सबसे बढ़िया उत्तर

यदि आप फ़र्स्टौर क्वेरी को एक बार में निष्पादित करना चाहते हैं, तो onSnapshot का उपयोग न करें। यह एक दस्तावेज़ पर एक श्रोता सेट करता है जो दस्तावेज़ में परिवर्तन होने पर ट्रिगर हो जाता है। आप लगभग निश्चित रूप से इसके बजाय get() का उपयोग करना चाहते हैं, जो एक बार में एक क्वेरी करता है।

साथ ही, आप एक वादा वापस नहीं कर रहे हैं जो सभी एसिंक्रोनस कार्य पूरा होने पर हल हो जाता है। यह उन सभी क्लाउड फ़ंक्शंस के लिए आवश्यक है जो HTTP फ़ंक्शन नहीं हैं। जैसा कि दस्तावेज़ीकरणget() एक वादा लौटाता है, इसलिए आपको शुरू किए गए एसिंक्स कार्य के लिए अन्य वादों के अलावा इसका उपयोग करना चाहिए। यदि आप अपने कार्य में वादों को सही ढंग से नहीं निभाते हैं, तो यह आपकी अपेक्षा के अनुरूप व्यवहार नहीं करेगा।

1
Doug Stevenson 12 अप्रैल 2020, 07:12