0

Я пытаюсь реализовать функцию поиска по электронной почте, а бэкенд - это хранилище данных firebase.запрос электронной почты в firebase в общедоступном разделе (реагировать на native, js), возвращающий нуль

Datastore: 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 
      }); 
     }; 
}; 

Я имею в виду его возвращение нулевой, потому что я не ссылаться на UID должным образом в пути, но я havn't удалось выяснить, как ссылаться на UID другого пользователя, кроме того, в настоящее время вошли в систему.

Альтернативой будет создание публичного раздела, который полностью открыт с помощью правил .write, которые отражают. Таким образом, UID не будет мешать.

Любые мысли? Заранее спасибо!

EDIT: Вот что журнал консоли выглядит следующим образом:

search text changing! 
searching firebase now! 
'searching txt is ', '[email protected]' 
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

Вы пропустили возврат:

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

Спасибо, что за быстрый ответ. Хотя, несмотря на то, что я добавляю 'return' его все еще null. – xclearner

+0

Да, оглядываясь назад, я не совсем уверен, что должен делать код. Вы возвращаетесь с верхнего уровня, но также используете снимок в обратном вызове 'once()' и отправляете его на 'dispatch()'. Более вероятно, что ваш путь 'public/uid/profile'' неверен, поскольку вы, вероятно, хотите использовать значение' uid' ** ** для текущего пользователя: ''public /' + firebase.auth() .currentUser.uid + '/ profile''. –

+0

Спасибо, Фрэнк! Извините, я не был таким ясным. отправка будет предлагать новое действие (SEARCH_EMAIL_SUCCESS), которое запускает новое состояние для страницы. В настоящее время я консоль регистрирует возврат, чтобы увидеть, работает ли механизм. Если я использую currentUser.uid, он возвращает только адрес currentUser, где, когда я пытаюсь вернуть искомый адрес электронной почты в хранилище данных. Имеет ли это смысл?Я довольно новичок в этом, поэтому я почти уверен, что я испортил путь где-то, потому что я не знал, как ссылаться на uid других пользователей на пути «pulic/uid/profile» хранилища данных – xclearner

0

Я думаю, что я нашел эту проблему. Способ настройки хранилища данных userEmail вложен в профиль и общедоступный, поэтому путь будет следующим:

public/$ uid/profile/userEmail.

У меня возникла проблема обойти аспект $ uid, и, просмотрев некоторую документацию по чтению и записи в хранилище данных, я понял, что структура хранилища данных не приводит к тому, что функция поиска не работает. Поэтому я изменил путь, в котором хранятся пользовательские данные, удалив уровень «профиля», тем самым более сглаживая данные. См изображение ниже для сравнения между Test1 и test2 & 3.

enter image description here

Теперь, когда я запрашиваю с orderByChild и поиск с [email protected], он работает.

вот код:

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!

Смежные вопросы