Firebase https onCall 函数被 cors 阻止

问题描述 投票:0回答:1

我有一个

sendMail
云功能,我想用它从我网站上的联系表单发送电子邮件。该网站托管在 Firebase 上,并具有自定义 Google 域。问题是,每当我尝试从托管站点调用该函数时,都会收到此错误。

enter image description here

这是我迄今为止尝试过的

  1. 我尝试从浏览器本地测试该功能,效果很好。没有cors错误。
  2. 通过从 firebase shell 调用该函数进行测试也可以正常工作,没有任何 cors 错误。

enter image description here

  1. 我已检查我的 Google Cloud 控制台并确保所有用户都可以调用该函数。 enter image description here

4.我也尝试过使用 cors 库来包装该函数,但这也不起作用:

这是我调用

sendMail
函数的方式:

handleSubmit = (e) => {
    e.preventDefault();
    const sendMail = firebase.app().functions('us-central1').httpsCallable("sendMail");
    
    sendMail({ details: this.state })
      .then((res) => {
        this.setState({
          loading: true,
        });
        this.notify("success");
      })
      .catch((error) => {
        this.notify(error);
      });
  };

这是整个

sendMail
函数:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const cors = require("cors")({ origin: true });
const nodemailer = require("nodemailer");

admin.initializeApp();

// Use gmail to set up transporter
let transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: functions.config().mail.user,
    pass: functions.config().mail.pass
  },
});

exports.sendMail = functions
  .region("us-central1")
  .https.onCall((data, context) => {
    const info = data.details;
    const mailOptions = {
      from: `${info.name} <${info.email}>`,
      to: functions.config().mail.dest,
      subject: info.subject,
      html: `<p style="font-size: 16px;">${info.name}, ${info.email}</p>
                    <p
                    style="
                        font-size: 1rem;
                        background: #FFECB3;
                        padding: 10px;
                        border-radius: 10px;">${info.message}</p>
                `, // email content in HTML
    };

    // returning results
    return transporter.sendMail(mailOptions, (err, info) => {
      if (err) {
        console.log("failed", err);
      }
    });
  });

我知道也有人问过类似的问题,但我确实尝试了几乎所有的方法。我仅在从我的 firebase 托管站点调用它时遇到 cors 问题。有人请帮忙!

reactjs firebase google-cloud-functions cors
1个回答
3
投票

onCall 函数的行为在 cors 方面与 onRequest 不同,例如,您需要确保从同一区域调用它。请参阅这篇文章

如果您的函数出错,则可能会出现 cors 问题,值得检查模拟器和您的发送邮件响应。

© www.soinside.com 2019 - 2024. All rights reserved.