React-Native + Firebase,登录时写入和读取,否则只读

时间:2018-04-23 09:38:00

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

我试图制作一个每个人都可以阅读的广告页面,但只有您登录后才能制作新的广告页面。我使用react-native和firebase作为数据库。 截至目前,如果我已登录,我可以写入数据库,但我无法从数据库中读取任何内容。

我不确定如何编写获取路径,因为当用户发布它时,使用$ {currentUser}标记执行此路径

  firebase.database().ref(`/users/${currentUser.uid}/ads`)

以下是firebase的规则

{
 "rules": {
  ".read": "true",
    "users": {
     "$uid": {
      ".write": "$uid === auth.uid"
   }
  }
 }
}

这是react-native

中的获取代码
export const publicAdFetch = () => {
 return (dispatch) => {
  firebase.database().ref('/users/ads')
   .on('value', snapshot => {
   dispatch({ type: PUBLICADS_FETCH_SUCCESS, payload: snapshot.val() 
  });
 });
 };
};

EDIT *****

这很好用,但我希望在Object.keys方法之外有一个调度方法。我想收集值并将它们返回到显示所有对象的列表中。

export const publicAdFetch = () => {
 return (dispatch) => {
  firebase.database().ref('/users').once('value').then((snapshot) => {
   const ads = snapshot.val();
    Object.keys(ads).map((objectKey, index) => {
    const value = ads[objectKey];
    console.log(value);
    dispatch({ type: PUBLICADS_FETCH_SUCCESS, payload: value });
   });
 });
};
};

1 个答案:

答案 0 :(得分:2)

我不知道反应,但我认为你没有使用正确的参考:

firebase.database().ref('/users/users')

应该:

    如果您希望读者阅读特定用户的广告,例如ref('users/' + userId + '/ads')或,请
  1. 包含userId 如果您想获得所有广告,请
  2. firebase.database().ref('/users')
  3. 编辑后发表评论:

    我再也不知道如何反应,所以我无法为您提供确切的代码,但您获得的确实是一个代表完整"用户"节点,包括所有usersIds及其子广告。

    如果(在纯javascript中)您执行如下操作,您将在控制台中显示每个userId下的对象。

    firebase.database().ref('/users').once('value').then(function(snapshot) {
    
        var ads = snapshot.val();
    
        Object.keys(ads).map(function(objectKey, index) {
            var value = ads[objectKey];
            console.log(value);
        });
    });
    

    如果您在userId节点下分享有关数据结构的更多信息以及您想要展示的内容,可能会为您提供有关如何获取它的更多信息。

    编辑后编辑

    您应该在Object.key()方法中构建有效负载,并在完成后传递它,如:

    export const publicAdFetch = () => {
    return (dispatch) => {
      firebase.database().ref('/users').once('value').then((snapshot) => {
        const ads = snapshot.val();
        let payload;
        Object.keys(ads).map((objectKey, index) => {
          const value = ads[objectKey];
          console.log(value);
          payload =+ value; //Probably it should be more complex here 
          //than just concatenating the values
          //depending on the payload format you need to e.g. build an array or an object
        });
        dispatch({ type: PUBLICADS_FETCH_SUCCESS, payload: payload });
      });
    };
    

    };