मेरे पास एक firebase फ़ंक्शन है जिसे sendMail कहा जाता है जिसका उपयोग ईमेल भेजने के लिए किया जाता है। मैं रिसीवर के ईमेल पते और फ़ंक्शन के लिए एक और पैरामीटर पास करने का प्रयास कर रहा हूं। मेरे vue ऐप में मैं फ़ंक्शन को निम्नानुसार कॉल करता हूं:

sendEmail(){
            console.log(this.email)
            let sendMail = firebase.functions().httpsCallable('sendMail');
            sendMail(
                {
                    "email": this.email,
                    "superu": this.superu
                }
            ).then(
                result => {
                    console.log(result)
                }
            )
        }

और मेरा कार्य index.js ऐसा दिखता है:

const functions = require('firebase-functions');
const admin = require("firebase-admin")
const nodemailer = require('nodemailer');

admin.initializeApp()


//google account credentials used to send email
var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: '*****@****.com',
        pass: '***********'
    }
});


exports.sendMail = functions.https.onRequest((req, res) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");        

    console.log(req.body['data']);
    const mailOptions = {
        from: `•••••••••@gmail.com`,
        to: req.body['data'].email,
        subject: 'contact form message',
        html: `<h2 style="color: teal">Order Confirmation</h2>
                            <a href="https://track-acquintances.firebaseapp.com/signup/${req.body.superu}">
                               <b> Register </b>"<br>
                            </a>`
    };


    return transporter.sendMail(mailOptions, (error, data) => {
        if (error) {
            return res.status(200).json({data: error.message});
        }
        data = JSON.stringify(data)
        return res.status(200).json({data: data});
    });

});

समस्या यह है कि मैं पारित ईमेल डेटा तक नहीं पहुंच सकता और फ़ंक्शन विफल हो जाता है। मैंने फंक्शन लॉग में req.body['data'] लॉग किया और मुझे { email: 'xxx@xx.xxx.x', superu: true } दिखाई दे रहा है। लेकिन मैंने req.body['data'].email और req.body['data']['email'] दोनों की कोशिश की और वे दोनों काम नहीं करते। और मेरे ब्राउज़र कंसोल में मुझे {data: "No recipients defined"} मिलता है। किसी भी सहायता की सराहना की जाएगी। शुक्रिया

1
Abdulaziz Yesuf 14 अप्रैल 2020, 15:35

1 उत्तर

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

आप दो प्रकार के क्लाउड फ़ंक्शंस को भ्रमित कर रहे हैं:

  • आपके क्लाउड फ़ंक्शन को HTTPS ट्रिगर फ़ंक्शन के रूप में परिभाषित किया गया है, जिसका अर्थ है कि आप कर सकते हैं किसी ब्राउज़र में इसके URL को एक्सेस करके, fetch पर कॉल करके, या XMLHTTPRequest का उपयोग करके इसका आह्वान करें।

  • आपका क्लाइंट कोड, एक तथाकथित कॉल करने योग्य क्लाउड फ़ंक्शन को लागू करने का प्रयास करता है, जो एक विभिन्न प्रकार। जबकि कॉल करने योग्य क्लाउड फ़ंक्शंस को सीधे HTTPS पर भी लागू किया जाता है, उनके पास लागू होने के लिए एक विशिष्ट वायर प्रोटोकॉल होता है।

चूंकि दो प्रकार के फ़ंक्शन मेल नहीं खाते हैं, आपका क्लाइंट कोड पैरामीटर को सर्वर द्वारा प्रबंधित किए जाने वाले प्रारूप से भिन्न प्रारूप में पास कर रहा है।

आपको या तो HTTPS फ़ंक्शन को कॉल करना होगा, या क्लाउड फ़ंक्शन को कॉल करने योग्य में बदलना होगा। बाद वाला कुछ इस तरह दिखेगा:

exports.sendMail = functions.https.onCall((data, context) => {
  const email = data.email;
  const superu = data.superu;

  ...
});
3
Frank van Puffelen 14 अप्रैल 2020, 13:22