Firebase实时数据库orderByChild报错:路径参数不符合规则求助
Firebase实时数据库路径参数无效问题解决
我在Firebase实时数据库中尝试通过邮箱过滤判断用户是否存在(存在则更新数据,不存在则创建新用户),同时用uid生成唯一父节点。但运行以下代码时出现错误:
useEffect(() => { const writeToDatabase = () => { if (location && location.coords && UserDataFromGoogleAuth) { const usersRef = ref(database, 'users'); const email = UserDataFromGoogleAuth.email; if (email) { const emailRef = orderByChild(usersRef, 'email'); const query = equalTo(emailRef, email); get(query).then((snapshot) => { const uuid = snapshot.exists() ? Object.keys(snapshot.val())[0] : uid(); const userRef = ref(database, `/users/${uuid}`); const userData = { id: uuid, name: UserDataFromGoogleAuth.displayName, email: email, includedKids: 0, isSubscribed: false, long: location.coords.longitude, lat: location.coords.latitude, online: props.online, profilePicture: UserDataFromGoogleAuth.photoURL, }; set(userRef, userData); }).catch(error => { console.log(error); }); } } }; writeToDatabase(); }, [UserDataFromGoogleAuth, location, props.online]);
错误信息:
ERROR Error: orderByChild failed: path argument was an invalid path = "MY_Database_path". Paths must be non-empty strings and can't contain ".", "#", "$", "[", or "]"
解决方法
错误根源是Firebase v9+模块化API的调用方式错误:orderByChild的参数应该是字段名字符串,而非数据库引用。你之前把usersRef作为第一个参数传入,导致API把引用当成路径解析,触发无效路径错误。
正确的查询写法需要用query函数组合数据库引用和查询条件:
// 替换原查询代码段 if (email) { // 正确组合查询条件 const q = query(usersRef, orderByChild('email'), equalTo(email)); get(q).then((snapshot) => { const uuid = snapshot.exists() ? Object.keys(snapshot.val())[0] : uid(); const userRef = ref(database, `/users/${uuid}`); const userData = { id: uuid, name: UserDataFromGoogleAuth.displayName, email: email, includedKids: 0, isSubscribed: false, long: location.coords.longitude, lat: location.coords.latitude, online: props.online, profilePicture: UserDataFromGoogleAuth.photoURL, }; set(userRef, userData); }).catch(error => { console.log(error); }); }
额外优化建议
如果邮箱是用户唯一标识,可以直接将处理后的邮箱作为节点键(需替换邮箱中的特殊字符,比如@换成%40,.换成%2E),这样无需遍历查询,直接定位节点,效率更高:
// 处理邮箱特殊字符 const sanitizedEmail = email.replace(/@/g, '%40').replace(/\./g, '%2E'); const userRef = ref(database, `/users/${sanitizedEmail}`); // 直接读写该节点即可,无需查询判断
内容的提问来源于stack exchange,提问作者Mahmoud Hlal
相关产品推荐
相关产品推荐

