Home > other >  How to get id of an object from firebase
How to get id of an object from firebase

Time:01-24

I am trying to get id of an object after set that object. But I am getting type error. TypeError: Cannot read properties of undefined (reading 'val'). How should I do that with firebase 9?

Here is the code that I want to work:

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);
      });

Thanks in advance.

CodePudding user response:

Why your code doesn't work

The documentation of set(ref, value) shows that is is defined as:

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

It returns a Promise<void>, so there's no snapshot being passed to your then.

If the promise resolves (and thus your then callback gets called) that the expense was written to the database on the server as is.


How to fix it

If you want to get the key of the push call, you can capture that outside of the set call already:

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

Calling push is a pure client-side operation, which is synchronous, so that doesn't require await or then (which should be used with asynchronous operations).


Further considerations

Note though that now you're only showing the expense locally after it's been written to the server. If that is a requirement for your use-case, then

  •  Tags:  
  • Related