【问题标题】:How to get id of an object from firebase如何从firebase获取对象的ID
【发布时间】:2022-01-23 19:02:21
【问题描述】:

我试图在设置该对象后获取该对象的 ID。但我收到类型错误。 TypeError:无法读取未定义的属性(读取“val”)。我应该如何使用 firebase 9 做到这一点?

这是我想要工作的代码:

set(push(ref(db, "expenses")), expense)
      .then((snapshot) => {
        console.log(snapshot.val());
        dispatch(
          addExpense({
            id: snapshot.key,
            ...expense,
          })
        );
      })
      .catch((e) => {
        console.log("This failed.", e);
      });

提前致谢。

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    为什么您的代码不起作用

    set(ref, value) 的文档显示定义为:

    function set(ref: DatabaseReference, value: unknown): Promise<void>
    

    它返回一个Promise&lt;void&gt;,所以没有snapshot 被传递给你的then。

    如果 Promise 解决(并因此调用您的 then 回调)expense 已按原样写入服务器上的数据库。


    如何解决

    如果您想获取push 调用的密钥,您可以在set 调用之外捕获它:

    const newRef = push(ref(db, "expenses"));
    set(newRef, expense)
      .then(() => {
        dispatch(
          addExpense({
            id: newRef.key,
            ...expense,
          })
        );
      })
      .catch((e) => {
        console.log("This failed.", e);
      });
    

    调用push 是纯客户端操作,它是同步的,因此不需要awaitthen(应与a同步操作一起使用)。


    进一步考虑

    请注意,现在您只是在将费用写入服务器后在本地显示费用。如果这是您的用例的要求,那么 ?。但是在使用 Firebase 时,很常见的是:

    1. expenses 上使用永久的onValue 侦听器以在用户界面中显示最新费用。
    2. 通过简单的调用编写新费用,无需then() 侦听器:set(push(ref(db, "expenses")), expense);
    3. Firebase SDK 将立即使用新值调用本地 onValue 侦听器,并假设写入成功。
    4. 因此您的 UI 将立即显示本地值,为用户提供几乎即时的响应。
    5. 在服务器(即您的安全规则)拒绝写入操作的(更不常见的)情况下,SDK 会使用更正的数据再次调用 onValue,以便您的 UI 可以更新状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-06
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多