Firebase https onCall işlevi cors tarafından engellendi

Nov 10 2020

sendMailSitemdeki bir iletişim formundan e-posta göndermek için kullanmak istediğim bir bulut işlevim var . Site, Firebase'de özel bir Google alanıyla barındırılıyor. Sorun şu ki, işlevi barındırılan siteden her çalıştırmaya çalıştığımda bu hatayı alıyorum.

İşte şimdiye kadar denediklerim

  1. İşlevi yerel olarak tarayıcıdan test etmeyi denedim ve gayet iyi çalışıyor. Cors hatası yok.
  2. Fonksiyonu firebase kabuğundan çağırarak test etmek de herhangi bir cors hatası olmadan gayet iyi çalışıyor.

  1. Google Cloud konsolumu kontrol ettim ve tüm kullanıcıların işlevi çalıştırabileceğinden emin oldum.

4. Ayrıca, işlevi sarmak için cors kitaplığını kullanmayı denedim, ancak bu da işe yaramadı:

İşlevimi şöyle çağırıyorum 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);
      });
  };

İşte tüm sendMailişlev:

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

Benzer soruların sorulduğunu biliyorum ama gerçekten neredeyse her şeyi denedim. Firebase'de barındırılan sitemden SADECE cors sorununu alıyorum. Lütfen yardım edin!

Yanıtlar

2 Cleanbeans Nov 11 2020 at 06:36

onCall işlevleri, korselerle ilgili olarak onRequest'ten farklı davranır, örneğin, aynı bölgeden aradığınızdan emin olmanız gerekir. Bu gönderiye bakın

Kors sorunu, işleviniz hatalıysa, öykünücüyü kontrol etmeye ve posta yanıtınızı göndermeye değerse ortaya çıkabilir.