在公共部分(native native,js)中查询firebase中的电子邮件,返回null

时间:2017-02-18 07:46:46

标签: javascript firebase react-native firebase-realtime-database firebase-security

我正在尝试实现一个电子邮件搜索功能,后端是firebase的数据存储区。

数据存储: enter image description here

安全规则

{
  "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

2 个答案:

答案 0 :(得分:0)

你错过了回报:

export const searchEmail = ({ searchText }) => {
    return (dispatch) => {
        return firebase.database().ref()
            ...

答案 1 :(得分:0)

我想我发现了这个问题。设置数据存储区的方式是,userEmail嵌套在profile和public下面,因此路径为:

公共/ $ UID /简档/ USEREMAIL。

我遇到了解决$ uid方面的问题,在查看了有关读取和写入数据存储区的文档之后,我意识到数据存储区的结构导致搜索功能无法工作。所以我通过删除'配置文件来更改存储用户数据的路径。从而使数据更加平坦。请参阅下面的图片,以便比较Test1和test2& 3.

enter image description here

现在,当我使用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!