Har*_*tta 1 javascript firebase react-native firebase-realtime-database
我有一个函数(尚未完成),该函数应检查用户名在Firebase数据库中是否已经存在/唯一。我在Google上搜索了如何实施此方法,并设法获得了以下信息。不幸的是,它不起作用,我什至没有任何console.logs。感谢您的帮助-我到底在做什么错?
onChangeUsername = (event) => {
var oldError = {...this.state.error};
firebase.database().ref().child("Usernames").orderByValue().once('value', (snapshot) => {
var exists = (snapshot.val() !== null);
console.log(exists);
console.log("hello");
});
if(this.state.validation.username.unique===true)
{oldError.username = "This username is already taken"}
else if((event.nativeEvent.text.length<this.state.validation.username.min) || (event.nativeEvent.text.length>this.state.validation.username.max) )
{oldError.username = "Username should be between " + this.state.validation.username.min + " and " + this.state.validation.username.max + " characters" ;}
else oldError.username = "";
this.setState({ username: event.nativeEvent.text, error:oldError })
}
Run Code Online (Sandbox Code Playgroud)
我的数据库结构如下:
Database:{ Usernames: {uid1: username1, uid2: username2}}
Run Code Online (Sandbox Code Playgroud)
****问题更新****在弗兰克发表评论后,我将代码更改为以下内容。它仍然不起作用,但是我发现了一些需要修复的错误:
onChangeUsername = (event) => {
var oldError = {...this.state.error};
firebase.database().ref().child("Usernames").orderByKey().equalTo("Username1").once('value', (snapshot) => {
var exists = (snapshot.val() !== null);
console.log(exists);
console.log("hello");
});
if(this.state.validation.username.unique===true)
{oldError.username = "This username is already taken"}
else if((event.nativeEvent.text.length<this.state.validation.username.min) || (event.nativeEvent.text.length>this.state.validation.username.max) )
{oldError.username = "Username should be between " + this.state.validation.username.min + " and " + this.state.validation.username.max + " characters" ;}
else oldError.username = "";
this.setState({ username: event.nativeEvent.text, error:oldError })
}
Run Code Online (Sandbox Code Playgroud)
和我的数据库到以下:
Database:{ Usernames: {Username1: uid1, Username2: uid2}}
Run Code Online (Sandbox Code Playgroud)
您在查询中缺少比较:
firebase.database().ref().child("Usernames").equalTo("Username1").orderByValue()
Run Code Online (Sandbox Code Playgroud)
我建议顺便说一句反转数据结构。如果希望用户名唯一,请使用这些作为父节点中的键:
Database:{
Usernames: {
Username1: uidOfUserWithUsername1,
Username2: uidOfUserWithUsername2
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您的查询将变得更加简单和快捷,因为您不需要查询。此外,该值现在使您可以轻松查找有关声明该用户名的用户的更多信息。