Firebase 实时数据库使快照更有价值

Posted

技术标签:

【中文标题】Firebase 实时数据库使快照更有价值【英文标题】:Firebase Realtime Database Making Snapshot Value Friendly 【发布时间】:2021-03-26 18:07:57 【问题描述】:

我在 TypeScript + Express 服务器中使用 Firebase 实时数据库 SDK 来创建 Rest API 后端。我有一个 React 前端,它使用 axios 从 API 端点获取数据。但是,每当我必须迭代子属性时,我也会感到头疼。

所以我创建了一个非常糟糕的代码来将这些 Firebase snapshots 转换为友好(或我认为是友好的)可读和可迭代的对象。

这是代码:

const form = snapshot.val();
form.id = snapshot.key;
form.steps = Object.keys(form.steps).map(stepKey => 
    form.steps[stepKey].id = stepKey;
    form.steps[stepKey].inputs = Object.keys(form.steps[stepKey].inputs).map(inputKey => 
        form.steps[stepKey].inputs[inputKey].id = inputKey;
        if (form.steps[stepKey].inputs[inputKey].conditions) 
            form.steps[stepKey].inputs[inputKey].conditions = Object.keys(form.steps[stepKey].inputs[inputKey].conditions).map(conditionKey => 
                form.steps[stepKey].inputs[inputKey].conditions[conditionKey].id = conditionKey;
                return form.steps[stepKey].inputs[inputKey].conditions[conditionKey];
            );
        
        return form.steps[stepKey].inputs[inputKey];
    );
    return form.steps[stepKey];
);

result.data = form as Form;

我知道这很糟糕,但现在我得到了(再次,我认为它是)一个可读的对象,其中包含要迭代的子数组内容,而且我可以想到一种方法来制作一个动态执行此操作的函数。

"data": 
    "author": "my@email.com",
    "created": "2020-12-14T00:04:57.205Z",
    "description": "test form",
    "steps": [
        
            "description": "test step",
            "inputs": [
                
                    "helper": "",
                    "inputId": "-MNpzudIoPnBezm4D9sG",
                    "label": "input 1",
                    "id": "-MOTZ7FOiffGLTKXPgyG"
                
            ],
            "position": 1,
            "title": "First Step",
            "id": "-MOTZ7FPzQaJ94NrZtAP"
        
    ],
    "title": "A Test Form",
    "id": "-MOTZ7FQ0v-tCs_sEAe2"

代替原来的内容(snapshot.val()):

"data": 
    "author": "my@email.com",
    "created": "2020-12-14T00:04:57.205Z",
    "description": "test form",
    "steps": 
        "-MOTZ7FPzQaJ94NrZtAP": 
            "description": "test step",
            "inputs": 
                "-MOTZ7FOiffGLTKXPgyG": 
                    "helper": "",
                    "inputId": "-MNpzudIoPnBezm4D9sG",
                    "label": "input 1"
                
            ,
            "position": 1,
            "title": "First Step"
        
    ,
    "title": "A Testing Form"

所以我正在考虑一个递归函数,它将用snapshot.forEach() 迭代snapshot,并且每次hasChildren() 将snapshot.key 附加为id,然后可能返回snapshot.val()。但我对“重新发明***”并不是很感兴趣。

上面的错误代码是解决我的问题还是我应该尝试不同的解决方案?

【问题讨论】:

【参考方案1】:

要遍历子快照,请使用内置的DataSnapshot.forEach() 操作。

所以而不是:

form.steps = Object.keys(form.steps).map(stepKey => 
    form.steps[stepKey].id = stepKey;
    ...
);

你会这样做:

snapshot.forEach((child) => 
    form.steps.push(
      id: child.key,
      ...child.val();
    );
    ...
);

【讨论】:

嘿弗兰克,我之前无法回答,因为我正在处理其他事情。它适用于第一次迭代(form.steps),但它不满足输入等等。无论如何,我会检查它作为正确答案。因为获得那个代表对你来说非常重要。感谢您的回答,我将继续阅读有关如何为其他子属性实现此功能的信息。

以上是关于Firebase 实时数据库使快照更有价值的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 实时将数据存储在本地 Room DB 上

(Swift) 如果我的节点是自定义索引的,如何只查询当前用户的实时数据的快照?

使用实时数据库 Firebase 时如何使我的数据库安全?

使用协程的 Firebase 实时快照监听器

Firebase 实时数据库值检索

Firebase 实时数据库中的子键问题仅在发布版本中