无法获取从函数调用发送到Firebase云函数的数据

时间:2020-04-14 12:35:23

标签: javascript firebase vue.js google-cloud-functions

我有一个名为firebase的{​​{1}}函数,该函数用于发送电子邮件。我正在尝试将收件人的电子邮件地址和另一个参数传递给该函数。在我的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']。任何帮助,将不胜感激。谢谢

1 个答案:

答案 0 :(得分:3)

您混淆了两种类型的云功能:

  • 您的云功能定义为HTTPS triggered function,这意味着您可以通过在浏览器中访问其URL,调用fetch或使用XMLHTTPRequest来调用它

  • 您的客户代码尝试调用另一种类型的所谓的Callable Cloud Function。可调用云函数也可以直接通过HTTPS调用,但是它们具有要调用的特定有线协议。

由于两种类型的函数不匹配,因此您的客户端代码将以与服务器正在处理的格式不同的格式传递参数。

您需要调用HTTPS函数,或将Cloud Function转换为Callable。后者看起来像:

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

  ...
});