невозможно получить данные, отправленные из вызова функции в облачные функции Firebase - PullRequest
1 голос
/ 14 апреля 2020

У меня есть 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 Ответ

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

Вы путаете два типа облачных функций:

  • Ваша облачная функция определяется как HTTPS-триггерная функция , что означает, что вы можете вызвать ее с помощью обращаясь к его URL в браузере, вызывая fetch или используя XMLHTTPRequest.

  • Ваш клиентский код пытается вызвать так называемую функцию вызываемого облака , который является другим типом. Хотя вызываемые облачные функции также вызываются напрямую через HTTPS, они имеют определенный c проводной протокол для вызова.

Поскольку эти два типа функций не совпадают, ваш клиентский код передает параметры в формате, отличном от того, который обрабатывает сервер.

Вам нужно будет либо вызвать функцию HTTPS, либо преобразовать функцию облака в Callable. Последний будет выглядеть примерно так:

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

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