ฟังก์ชัน Firebase https onCall ถูกบล็อกโดย cors

Nov 10 2020

ฉันมีsendMailฟังก์ชันระบบคลาวด์ที่ฉันต้องการใช้เพื่อส่งอีเมลจากแบบฟอร์มการติดต่อบนไซต์ของฉัน ไซต์นี้โฮสต์บน Firebase ด้วยโดเมน Google ที่กำหนดเอง ปัญหาคือฉันได้รับข้อผิดพลาดนี้ทุกครั้งที่พยายามเรียกใช้ฟังก์ชันจากไซต์ที่โฮสต์

นี่คือสิ่งที่ฉันได้ลองแล้ว

  1. ฉันได้ลองทดสอบฟังก์ชันในเครื่องจากเบราว์เซอร์แล้วและใช้งานได้ดี ไม่มีข้อผิดพลาดของคอร์
  2. การทดสอบโดยเรียกใช้ฟังก์ชันจากเชลล์ firebase ก็ใช้ได้ดีโดยไม่มีข้อผิดพลาดใด ๆ

  1. ฉันตรวจสอบคอนโซล Google Cloud ของฉันแล้วและแน่ใจว่าผู้ใช้ทุกคนสามารถเรียกใช้ฟังก์ชันนี้ได้

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 ของฉันเท่านั้น ใครก็ได้โปรดช่วย!

คำตอบ

2 Cleanbeans Nov 11 2020 at 06:36

การทำงานของฟังก์ชัน onCall แตกต่างจาก onRequest ที่เกี่ยวข้องกับ cors ตัวอย่างเช่นคุณต้องแน่ใจว่าคุณเรียกใช้งานจากภูมิภาคเดียวกัน ดูโพสต์นี้

ปัญหาคอร์อาจเกิดขึ้นได้หากฟังก์ชันของคุณผิดพลาดควรตรวจสอบในโปรแกรมจำลองและการตอบกลับอีเมลของคุณ