Firebase V9 where查询报错:Expected type 'ba', but it was: a custom Pa object
问题原因与解决方案
核心错误点
- 误用
getDoc方法:getDoc只能用来获取单个指定ID的文档,根本不接受query对象(你用query()构建的是集合查询),这就是触发Expected type 'ba', but it was: a custom Pa object错误的直接原因。 - 错误传递查询条件:第二次尝试里把
where条件传给doc()方法完全不对,doc()的作用是指定具体文档ID,不支持添加查询条件。
正确实现代码
方式一:用async/await写法(更直观)
const router = useRouter() const paletteData = router.query const [palette, setPalette] = useState([]) useEffect(() => { // 把异步逻辑封装成函数 const fetchPalette = async () => { // 构建集合查询:指定集合 + where字段匹配条件 const queryRef = query(collection(db, 'palettes'), where("slug", "==", paletteData.palette)); // 用getDocs获取查询结果(返回包含所有匹配文档的快照) const querySnapshot = await getDocs(queryRef); if (!querySnapshot.empty) { // 因为slug是唯一字段,直接取第一个匹配的文档 const targetDoc = querySnapshot.docs[0]; setPalette(targetDoc.data()); console.log("文档数据:", targetDoc.data()); } else { console.log("没有找到匹配的文档!"); } }; // 确保参数存在再发起请求,避免无效查询 paletteData.palette && fetchPalette(); }, [router, paletteData.palette])
方式二:用.then链式调用写法
const router = useRouter() const paletteData = router.query const [palette, setPalette] = useState([]) useEffect(() => { if (!paletteData.palette) return; const queryRef = query(collection(db, 'palettes'), where("slug", "==", paletteData.palette)); getDocs(queryRef).then(querySnapshot => { if (!querySnapshot.empty) { const targetDoc = querySnapshot.docs[0]; setPalette(targetDoc.data()); console.log("文档数据:", targetDoc.data()); } else { console.log("没有找到匹配的文档!"); } }).catch(err => { console.error("查询出错:", err); }); }, [router, paletteData.palette])
额外提示
- 提前判断
paletteData.palette是否存在,避免传入空值导致查询无效。 - 如果
slug字段不是全局唯一的,需要遍历querySnapshot.docs来处理所有匹配的文档。 - 异步操作记得加错误捕获,避免控制台报错无法追踪问题。
内容的提问来源于stack exchange,提问作者RobbieC
相关产品推荐
相关产品推荐

