Fungsi onCall https Firebase diblokir oleh kors

Nov 10 2020

Saya memiliki sendMailfungsi cloud yang ingin saya gunakan untuk mengirim email dari formulir kontak di situs saya. Situs dihosting di Firebase dengan domain Google khusus. Masalahnya adalah saya mendapatkan kesalahan ini setiap kali saya mencoba menjalankan fungsi dari situs yang dihosting.

Inilah yang telah saya coba sejauh ini

  1. Saya telah mencoba menguji fungsi secara lokal dari browser dan berfungsi dengan baik. Tidak ada kesalahan kors.
  2. Pengujian dengan menjalankan fungsi dari firebase shell juga berfungsi dengan baik tanpa ada kesalahan cors.

  1. Saya telah memeriksa konsol Google Cloud saya dan memastikan semua pengguna dapat menjalankan fungsi tersebut.

4. Saya juga mencoba menggunakan pustaka cors untuk membungkus fungsi tetapi itu juga tidak berhasil:

Inilah cara saya memanggil sendMailfungsi saya :

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);
      });
  };

Inilah keseluruhan sendMailfungsinya:

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);
      }
    });
  });

Saya tahu pertanyaan serupa telah diajukan tetapi saya benar-benar telah mencoba hampir semuanya. Saya HANYA mendapatkan masalah cors saat menjalankannya dari situs saya yang dihosting firebase. Seseorang, tolong bantu!

Jawaban

2 Cleanbeans Nov 11 2020 at 06:36

perilaku fungsi onCall berbeda dari onRequest yang berkaitan dengan cors, misalnya Anda perlu memastikan Anda memanggilnya dari wilayah yang sama. Lihat posting ini

Masalah cors dapat terjadi jika fungsi Anda mengalami error, perlu diperiksa di emmulator & respons email pengiriman Anda.