【发布时间】: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