【问题标题】:Can't call firebase cloud function from firebase firestore get().then() response无法从 firebase firestore get().then() 响应调用 firebase 云功能
【发布时间】:2021-12-15 12:52:43
【问题描述】:

我正在尝试从 firebase firestore get().then() 函数内部调用 firebase 云函数,但它不起作用。我收到以下错误:

CORS 策略已阻止访问从源“http://127.0.0.1:5500”在“https://europe-west3-timedshop-a5a66.cloudfunctions.net/createStripeCheckout”获取:否“访问-请求的资源上存在 Control-Allow-Origin' 标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

POST https://europe-west3-timedshop-a5a66.cloudfunctions.net/createStripeCheckout net::ERR_FAILED 500

未捕获(承诺中)错误:内部 在新的 m (error.ts:66) 在 b (error.ts:175) 在 k。 (service.ts:296) 在 tslib.es6.js:102 在 Object.next (tslib.es6.js:83) 在 r (tslib.es6.js:73)

我在原版 html 和 js 中工作。 当我将云函数调用移到 Firestore get().then() 之外时,它可以工作。我可以这样做,但我不知道如何让它等待items 变量从firestore 获取它的值。任何解决方案都适合我。

function checkout() {
    var items = [];
    firebase.auth().onAuthStateChanged(function (user) {
        if (user) {
            db.collection("users")
                .doc(user.uid)
                .get()
                .then((data) => {
                    data.data().cart.forEach((cartItemData) => {
                        const words = cartItemData.split("-");
                        var collec =
                            cartItemData.charAt(0) == "0" ? "women" : "men";
                        var productID = words[0];
                        var color = words[2];
                        var sizeSelect = document.getElementById(
                            cartItemData + "sizeSelect"
                        );
                        var quantitySelect = document.getElementById(
                            cartItemData + "quantitySelect"
                        );
                        size =
                            sizeSelect.options[sizeSelect.selectedIndex].value;
                        var quantity =
                            quantitySelect.options[quantitySelect.selectedIndex]
                                .value;
                        console.log(productID, size, quantity, color);

                        let obj = {
                            productID: productID,
                            size: size,
                            quantity: quantity,
                            color: color,
                        };
                        items.push(obj);
                    });
                    callFunction(items); // here the firestore cloud function is called
                });
        }
    });
}
function callFunction(items) {
    const createStripeCheckout = firebase
        .app()
        .functions("europe-west3")
        .httpsCallable("createStripeCheckout");
    const stripe = Stripe(
        "pk_test_51JjMu9BKwB7V1OnRcwrPosArKwGOJORreGvWAnLmXbei1rDQzgsX8UIXFZTbSfhH5dmakmwyoLvVhteLeywH3zM400QT4cae9Y"
    );
    console.log(items.length);
    createStripeCheckout({ items: items }).then((response) => {
        const sessionId = response.data.id;
        stripe.redirectToCheckout({
            sessionId: sessionId,
        });
    });
}

云功能代码:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.createStripeCheckout =
  functions.region("europe-west3").https.onCall(async (data, context) => {
    const lineItems = [];
    console.log("dataItems: ", data.items);
    data.items.forEach(async (prodData) => {
      console.log("prodData: ", prodData);
      const productID = prodData.productID;
      const size = prodData.size;
      const color = prodData.color;
      const quanity = prodData.quanity;
      let collec;
      let name;
      let price;
      let type;
      let description;
      if (productID.charAt(0) == "0") {
        collec = "women";
      } else {
        collec = "men";
      }
      await admin.collection(collec).doc(productID).get().then((qdata)=>{
        name = qdata.data().name;
        price = qdata.data().price * 100;
        if (productID.charAt(0) == "0") {
          type = "Women's" + qdata.data().type;
        } else {
          type = "Men's" + qdata.data().type;
        }
        description = type + " - " + size + " - " + color;
      });

      const obj = {
        price_data: {
          currency: "eur",
          product_data: {
            name: name,
            description: description,
          },
          unit_amount: price,
        },
        adjustable_quantity: {
          enabled: true,
          maximum: 5,
          minimum: 1,
        },
        quanity: quanity,
      };
      console.log("obj", obj);
      lineItems.push(obj);
    });
    console.log("lineitems: ", lineItems);
    const stripe = require("stripe")(functions.config().stripe.secret_key);
    const session = await stripe.checkout.sessions.create({
      payment_method_types: ["card", "sepa_debit"],
      shipping_rates: ["<<string hidden by me>>"],
      shipping_address_collection: {
        allowed_countries: ["RO"],
      },
      mode: "payment",
      success_url: "http://localhost:5500/success",
      cancel_url: "http://localhost:5500/cancel",
      line_items: lineItems,
    });
    return {
      id: session.id,
    };
  });

【问题讨论】:

  • 您是否检查了有关该主题的一些前几个问题? stackoverflow.com/….
  • 感谢您正确编辑我的问题和此评论。我检查了该主题的问题,发现与我的问题有点匹配的唯一解决方案是创建 Cloud Functions Invoker 并设置为 allUsers。它没有工作,但..
  • 我建议您在问题中展示您对 Cloud Function 所做的操作(其下方有一个编辑链接),因为问题更可能出现在这一方面,而不是您如何处理的代码中调用它。
  • 好吧,我刚做了。

标签: javascript firebase google-cloud-firestore google-cloud-functions cors


【解决方案1】:

我解决了这个问题!这是我犯的打字错误。我写的不是admin.firestore().collection().....,而是admin.collection().....。现在可以了。

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2019-01-03
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多