Firebase v8转v9:Stripe Payment Intent相关Firestore代码转换求助
Firebase v8 转 v9 Firestore 代码(Stripe Payment Intent 场景)
正确的v9模块化代码
Firebase v9采用模块化API,你可以通过两种方式实现原v8代码的功能:
写法一(直接拼接路径)
// 先确保导入所需的Firestore方法 import { doc, setDoc } from "firebase/firestore"; // 假设db是已初始化的Firestore实例 await setDoc( doc(db, "users", user?.uid, "orders", paymentIntent.id), { basket: basket, amount: paymentIntent.amount, created: paymentIntent.created, } );
写法二(分步构建引用)
如果需要更清晰的分步逻辑,可拆分引用创建步骤:
import { doc, setDoc, collection } from "firebase/firestore"; // 1. 获取目标用户的文档引用 const userDocRef = doc(db, "users", user?.uid); // 2. 获取该用户下的orders集合引用 const ordersCollectionRef = collection(userDocRef, "orders"); // 3. 获取要写入的订单文档引用 const orderDocRef = doc(ordersCollectionRef, paymentIntent.id); // 写入订单数据 await setDoc(orderDocRef, { basket: basket, amount: paymentIntent.amount, created: paymentIntent.created, });
你两种尝试写法的问题分析
尝试写法1的问题:
collection(db, "users")获取的是users集合引用,不是单个用户的文档引用getDoc(docRef)逻辑错误:getDoc用于读取单个文档,不能对集合调用;且此处无需读取文档,仅需构建引用即可,不需要发起读请求paymentRef = collection(docRefId, "orders")中docRefId是getDoc返回的Promise对象,不是有效的文档引用,无法基于它创建子集合
尝试写法2的问题:
doc(collection(db, "users", user?.uid))结构错误:collection的参数是交替的集合名和文档ID,collection(db, "users", user?.uid)会被解析为users/{user.uid}路径的集合(不符合你的数据结构),正确做法是先通过doc(db, "users", user?.uid)获取用户文档引用,再基于它创建orders集合引用
内容的提问来源于stack exchange,提问作者Anthon Rodrigues
相关产品推荐
相关产品推荐

