Redux Firebase Saga中用户名存在判断逻辑异常求助
解决Firebase用户名存在判断逻辑误触发的问题
我来帮你排查下问题——你的判断逻辑每次都触发,大概率是对Firestore快照的处理方式出了问题,咱们来一步步修正:
核心问题分析
- 错误的快照数据访问方式:你代码里写的是
snapshot.data,但Firestore文档快照获取数据需要调用方法snapshot.data(),直接访问data属性会拿到一个函数引用(而非实际数据),这会导致你的if(snapshot.data)条件永远为真,不管用户名是否存在都会触发提示。 - 更可靠的存在性判断:Firestore其实提供了更直接的文档存在性标识——
snapshot.exists,这个布尔值能明确告诉你目标文档是否存在,比判断数据更准确。
修正后的Saga代码
推荐用snapshot.exists来判断,逻辑更清晰:
const snapshot = yield call(rsf.firestore.getDocument, `usernames/${values.username}`); // 先检查文档是否存在,再执行提示 if (snapshot.exists) { yield put(stopSubmit(form, {username: "Username already exists"})); return; }
如果你更习惯通过数据是否存在来判断,记得要调用data()方法:
const snapshot = yield call(rsf.firestore.getDocument, `usernames/${values.username}`); const userDocData = snapshot.data(); if (userDocData) { yield put(stopSubmit(form, {username: "Username already exists"})); return; }
额外提醒
- 确保你的
usernames集合确实是用用户名作为文档ID来存储的,这样通过getDocument直接查询才是正确的逻辑。 - 查询不存在的文档时,
getDocument不会抛出错误,只会返回一个exists为false的快照,所以正常场景下不需要额外捕获错误(如果担心网络问题可以加try/catch)。
内容的提问来源于stack exchange,提问作者DevCo
相关产品推荐
相关产品推荐

