Firebase v9 Firestore查询问题:else语句未执行
Firestore查询用户名存在性时else分支不执行问题
我在构建编辑个人资料流程时遇到了问题:用户数据存储在Firestore数据库中,查询用户名是否被占用时,if/else语句无法正常执行。
当前代码:
const userQ = query( collection(db, "users"), where("username", "==", username) ); const queryName = await getDocs(userQ); queryName.forEach((doc) => { if (doc.exists()) { console.log("ERROR. Username taken."); } else { console.log("User is available"); } });
问题详情:
当集合中存在对应用户名的文档时,控制台能正确输出提示,说明数据结构与路由无误;但不存在该文档时,else语句完全不执行,无任何日志输出。我尝试过使用.length和.size属性,均未解决问题。该问题与Stack Overflow上Firebase v8的同类问题类似,但适配方案无效。
问题根源
问题出在forEach循环的逻辑上:当查询结果为空(没有匹配的文档)时,forEach根本不会触发执行,自然走不到else分支。你需要先判断查询结果的整体状态,再做后续处理。
修正方案
直接通过查询快照的empty属性判断是否存在匹配文档,这是Firestore推荐的方式:
const userQ = query( collection(db, "users"), where("username", "==", username) ); const querySnapshot = await getDocs(userQ); if (!querySnapshot.empty) { // 存在匹配的用户名 console.log("ERROR. Username taken."); } else { // 用户名可用 console.log("User is available"); }
如果需要遍历文档(比如处理多结果场景,但用户名通常是唯一的,这个场景下没必要),也可以先判断快照的size属性:
const userQ = query( collection(db, "users"), where("username", "==", username) ); const querySnapshot = await getDocs(userQ); if (querySnapshot.size > 0) { querySnapshot.forEach((doc) => { console.log("ERROR. Username taken."); }); } else { console.log("User is available"); }
说明
querySnapshot.empty是Firestore提供的布尔属性,直接标识查询结果是否为空,比size属性更直观。- 当没有匹配文档时,
querySnapshot.size为0,empty为true,此时会进入else分支输出提示。
内容的提问来源于stack exchange,提问作者filmsaremyalc
相关产品推荐
相关产品推荐

