Firebase集成Stripe报错:TypeError: n.indexOf is not a function
已在Firebase中集成Stripe,用户升级套餐时,执行创建users集合下checkout_sessions文档的代码时抛出TypeError: n.indexOf is not a function错误。尝试过添加try-catch排查、修改集合引用写法等方法,Firebase配置正常,仍未解决问题。
原代码
import { getFirestore, collection, addDoc, doc, onSnapshot, } from "firebase/firestore"; import initializeStripe from "./initializeStripe"; export async function createMonthlyCheckout(uid) { let checkoutSessionRef; try { const firestore = getFirestore(); checkoutSessionRef = await addDoc( collection(doc(firestore, "users", uid), "checkout_sessions"), { price: "price_1ODfHmDueGWaYjB35b45Vl1B", success_url: window.location.origin + "/settings", cancel_url: window.location.origin + "/for-you", } ); console.log("Document added with ID: ", checkoutSessionRef.id); onSnapshot(checkoutSessionRef, (snap) => { const { sessionId } = snap.data(); if (sessionId) { initializeStripe().then((stripe) => { stripe.redirectToCheckout({ sessionId }); }); } }); } catch (error) { console.error("Error adding document: ", error); } }
尝试修改的集合引用写法
checkoutSessionRef = await addDoc( collection(db,"users", uid, "checkout_sessions"), { price: "price_1ODfHmDueGWaYjB35b45Vl1B", success_url: window.location.origin + "/settings", cancel_url: window.location.origin + "/for-you", } );
报错信息
控制台抛出TypeError: n.indexOf is not a function
检查Firebase依赖版本:这个错误大概率是Firebase SDK版本不兼容导致的,尤其是Firestore和Stripe扩展的版本不匹配。建议把所有Firebase相关依赖升级到最新稳定版,或者对照Stripe扩展文档确认要求的SDK版本范围。
验证uid参数有效性:两种集合引用写法本身都没问题,但要确保传入的
uid是有效的字符串。如果uid是null、undefined或者非字符串类型,会导致集合引用生成异常,触发这类错误。可以在函数开头加console.log(uid)确认参数是否正确。检查Stripe扩展配置:确认Firebase控制台里的Stripe扩展(
firebase-stripe-payments)已正确安装,且checkout_sessions集合的路径和规则配置符合要求。扩展需要自动监听这个集合的创建事件来生成Stripe Session ID,路径配置错了会导致扩展处理失败,进而引发前端异常。确认initializeStripe函数返回值:确保
initializeStripe返回的是合法的Stripe实例,没有在初始化时返回undefined或错误对象。可以在调用前打印initializeStripe()的返回结果,验证实例有效性。调整异步逻辑顺序:虽然当前代码是在
addDoc之后调用onSnapshot,但可以尝试改用getDoc先获取文档,再检查sessionId,避免监听未完全写入的文档导致的异常。示例代码如下:
const snap = await getDoc(checkoutSessionRef); const { sessionId } = snap.data(); if (sessionId) { const stripe = await initializeStripe(); stripe.redirectToCheckout({ sessionId }); }
内容的提问来源于stack exchange,提问作者Haroon

