javascript - Firebase 每次都会返回一个不同名称的对象

标签 javascript reactjs firebase

我有这个查询:

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,我怎样才能获取对象中的信息呢?

最佳答案

questionsRef 是查询(请参阅 doc )

通过在此查询上调用 on(),您将“监听查询“位置”处的数据更改。并且“每当数据更改时都会触发回调”,请参阅doc here 。因此,如果您每次收到不同的对象,那是因为在与您的查询相对应的节点下创建了一个对象(可能是一个新的 answer,就您的 JSON 而言)已在您的问题中发布)。

所以如果你想要的是获取一个节点的具体值,你应该使用once(),它会“监听指定事件类型的一个事件,然后停止监听” ”。文档是 here .

另请注意,“即使查询只有一个匹配项,快照也是一个列表”。这意味着您必须“循环结果”,例如:

questionsRef.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

请参阅此处的详细文档:https://firebase.google.com/docs/database/web/lists-of-data#listen_for_value_events

关于javascript - Firebase 每次都会返回一个不同名称的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50646235/

相关文章:

javascript - react redux 异步加载 FB javascript sdk

android - Firebase DataSnapshot 空值

java - 在 Docker 中运行时,Firestore 模拟器无法启动

ios - Xcode 返回链接器错误 "library not found for -lFirebaseAuth"

javascript - 关于如何刷新此验证码类型有什么想法吗?

javascript - 无法在 jQuery 函数中返回 $.posted php 文件数据

javascript - 在自定义 Telescope 主题中显示域名 url

reactjs - i18next + react 路由器 : My URL isn't changing correctly when language is switched

javascript - typescript 导入/导出

javascript - 如何限制我的node.js Swagger 服务器的堆栈跟踪?