Firebase 9模块化Web SDK中FieldPath.documentId()的替代语法及代码适配问题
Firebase 9模块化SDK中使用documentId查询文档ID的正确姿势
我来帮你解决这个问题,你的代码里有两个关键问题导致出错,咱们一步步修正:
首先,明确核心错误点
- 你调用了
query()函数,但没有保存它的返回结果,反而直接返回了query这个函数本身——咱们需要的是调用query()后生成的查询对象,不是函数本身。 - Firebase 9采用函数式API,多个查询条件(比如两个
where)需要作为参数一次性传给query(),而不是像SDK 8那样链式调用。
步骤1:确认导入必要的函数
确保你已经从firebase/firestore导入了所有需要的工具函数:
import { getFirestore, collection, query, where, documentId, getDocs } from "firebase/firestore";
步骤2:修正getByIdQuery函数
这是你代码里的核心问题所在,重新写这个查询生成函数:
export const getByIdQuery = (docIds, collectionName) => { const collectionRef = collection(dbInstance, collectionName); // 把两个where条件都作为参数传给query函数 const documentQuery = query( collectionRef, where('isFinal', '==', true), where(documentId(), 'in', docIds) ); return documentQuery; // 返回生成好的查询对象,而不是query函数 };
步骤3:确保Firestore实例初始化正确
别忘了dbInstance必须是已经初始化好的Firestore实例,比如:
// 先初始化Firebase App import { initializeApp } from "firebase/app"; const firebaseConfig = { /* 你的Firebase配置信息 */ }; const firebaseApp = initializeApp(firebaseConfig); // 再获取Firestore实例 const dbInstance = getFirestore(firebaseApp);
额外说明
documentId()函数确实是Firebase 9里用来指代文档ID的特殊FieldPath,只要正确导入,直接在where()里用就没问题,不需要额外处理。- Firebase 9的模块化API和SDK 8的链式调用API逻辑完全不同,记住所有查询约束(where、orderBy、limit等)都要作为参数传给
query()函数,而不是链式调用。
这样修改后,你的getRecordsByIds整个流程就能正常工作了,试试吧!
内容的提问来源于stack exchange,提问作者Harshavardhan
相关产品推荐
相关产品推荐

