You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase集成Stripe报错:TypeError: n.indexOf is not a function

Firebase集成Stripe创建Checkout Session时抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:36:32