我试图制作一个每个人都可以阅读的广告页面,但只有您登录后才能制作新的广告页面。我使用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 });
});
});
};
};
答案 0 :(得分:2)
我不知道反应,但我认为你没有使用正确的参考:
firebase.database().ref('/users/users')
应该:
ref('users/' + userId + '/ads')
或,请firebase.database().ref('/users')
编辑后发表评论:
我再也不知道如何反应,所以我无法为您提供确切的代码,但您获得的确实是一个代表完整"用户"节点,包括所有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 });
});
};
};