我有这个问题:
const questionsRef = firebase
.database()
.ref('Works')
.orderByChild('firebaseKey')
.equalTo(this.props.match.params.id);
它有效,但作为回报我得到了这个:
"-LDvDwsIrf_SCwSinpMa": { //!!!this is different for every object I get
"answers": {
"-LDvEEpkgbB9WFQDHuUZ": {
"date": {...},
"downloadURL": "https://firebasestorage.googleapis.com/v0/b/uczsieapp.appspot.com/o/images%2F483a1473-3056-4817-a495-9edb6589873e?alt=media&token=dae88bc8-fa39-4a36-97a4-7c9bbcb3898b",
"firebaseKey": "-LDvEEpkgbB9WFQDHuUZ",
"seen": true,
"workKey": "-LDvDwsIrf_SCwSinpMa"
}
},
"available": true,
"boostAmount": 1,
"category": "Historia",
"createDate": {...},
"creatorID": "tZS6bfXUujNXUAi6Rd0nPlmye693",
"finishDate": {...},
"firebaseKey": "-LDvDwsIrf_SCwSinpMa",
"level": "Liceum",
"number": 1,
"photoURL": "https://firebasestorage.googleapis.com/v0/b/uczsieapp.appspot.com/o/images%2F365bfdd3-351f-4fb9-bca0-35890b2fc16d?alt=media&token=ed1f88bd-00ce-462a-b8eb-2fb4d2850142",
"pointAmount": 32,
"pointBoost": 64,
"solverID": "tZS6bfXUujNXUAi6Rd0nPlmye693",
"state": "Completed",
"taskAmount": 4
},
事情就是这样:-LDvDwsIrf_SCwSinpMa
是id。每次它返回一个不同的id。那么我怎么能自动化呢?现在我得到这样的话:
componentDidMount() {
// var key = ;
const questionsRef = firebase.database().ref('Works').orderByChild('firebaseKey').equalTo(this.props.match.params.id);
questionsRef.on('value', (snapshot) => {
let question = snapshot.val();
console.log(question);
let newState = {
id: question.id,
category: question.category,
level: question.level,
pointAmount: question.pointAmount,
pointBoost: question.pointBoost,
photoURL: question.photoURL,
};
console.log(newState);
this.setState({
question: newState
});
});
}
那么如果每次都返回不同的id,我怎么能在对象中获取信息呢?
答案 0 :(得分:1)
如果questionsRef
等于
{
"-LDvDwsIrf_SCwSinpMa": {
"answers": {},
......
}
}
Object.keys(questionsRef)[0]
将等于LDvDwsIrf_SCwSinpMa
答案 1 :(得分:1)
questionsRef
是查询(请参阅doc)
通过在此查询上调用on()
,您“正在侦听查询”位置“的数据更改。并且”只要数据发生更改就会触发“回调”,请参阅文档{{3}因此,如果您每次都收到一个不同的对象,那是因为在您的查询对应的节点下创建了一个对象(可能是一个新的answer
,关于您在问题中发布的JSON)
因此,如果你想要的是获得一个节点的特定值,你应该使用once()
,它将“直接监听指定事件类型的一个事件,然后停止监听”。 doc是here。
另请注意,“即使查询只有一个匹配项,快照也是一个列表”。这意味着您必须“循环结果”,如:
questionsRef.once('value', function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var childKey = childSnapshot.key;
var childData = childSnapshot.val();
// ...
});
});
请参阅此处的详细文档:here