我正在尝试实现一个电子邮件搜索功能,后端是firebase的数据存储区。
安全规则
{
"rules": {
"users": {
"$uid":{
".read": "$uid === auth.uid ",
".write": "$uid === auth.uid"
}
},
"public": {
".read": "auth != null",
"$uid":{
".write": "$uid === auth.uid",
".indexOn": ["userEmail"],
}
}
}
}
对于此实例,我正在尝试通过数据存储的公共部分中的电子邮件搜索其他用户。
export const searchEmail = ({ searchText }) => {
return (dispatch) => {
firebase.database().ref()
.child('public/uid/profile')
.orderByChild('userEmail')
.equalTo(searchText)
// .startAt(`${searchText}`)
// .endAt(`${searchText}`)
.once('value', snapshot => {
dispatch({ type: SEARCH_EMAIL_SUCCESS, payload: snapshot.val() });
const foundUser = snapshot.val();
console.log('the found users are', foundUser);
//the snap.val() is the returned data that's returned
});
};
};
我认为它返回null因为我没有在路径中正确引用UID但是我无法弄清楚如何引用除当前登录之外的其他用户的UID。
另一种方法是使用反映的.write规则创建完全公开的公共部分。这样UID就不会妨碍..
有什么想法?提前致谢!
编辑:这是控制台日志的样子:
search text changing!
searching firebase now!
'searching txt is ', 'T@t.com'
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "userEmail" at /public/uid/profile to your security rules for better performance
{ type: 'search_email_success', payload: null }
'the found users are', null
答案 0 :(得分:0)
你错过了回报:
export const searchEmail = ({ searchText }) => {
return (dispatch) => {
return firebase.database().ref()
...
答案 1 :(得分:0)
我想我发现了这个问题。设置数据存储区的方式是,userEmail嵌套在profile和public下面,因此路径为:
公共/ $ UID /简档/ USEREMAIL。
我遇到了解决$ uid方面的问题,在查看了有关读取和写入数据存储区的文档之后,我意识到数据存储区的结构导致搜索功能无法工作。所以我通过删除'配置文件来更改存储用户数据的路径。从而使数据更加平坦。请参阅下面的图片,以便比较Test1和test2& 3.
现在,当我使用orderByChild查询并使用T2@t.com进行搜索时,它可以正常工作。
这里是代码:
console.log('searchEmail called and the text is', searchText);
const rootRef = firebase.database().ref();
const oneRef = rootRef.child('public').orderByChild('userEmail');
console.log('the order by user email is ', oneRef);
oneRef.equalTo(`${searchText}`)
.once('value', snapshot => {
dispatch({ type: SEARCH_EMAIL_SUCCESS, payload: snapshot.val() });
const foundUser = snapshot.val();
console.log('the found user is', foundUser);
现在它返回已被搜索的用户! Wooohoo!