Estoy tratando de obtener la identificación de un objeto después de configurar ese objeto. Pero estoy recibiendo un error de tipo. TypeError: no se pueden leer las propiedades de undefined (leyendo 'val'). ¿Cómo debo hacer eso con firebase 9?
Aquí está el código que quiero trabajar:
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); });Gracias por adelantado.
La documentación de set(ref, value) muestra que se define como:
function set(ref: DatabaseReference, value: unknown): Promise<void>
Devuelve un Promise<void> , por lo que no se pasa ninguna snapshot a su entonces.
Si la promesa se resuelve (y, por lo tanto then se llama a su devolución de llamada), el expense se escribió en la base de datos en el servidor tal como está.
Si desea obtener la clave de la llamada push , ya puede capturarla fuera de la llamada set :
const newRef = push(ref(db, "expenses")); set(newRef, expense) .then(() => { dispatch( addExpense({ id: newRef.key, ...expense, }) ); }) .catch((e) => { console.log("This failed.", e); }); Llamar push es una operación pura del lado del cliente, que es sincrónica, por lo que no requiere await o then (que debe usarse con operaciones sincrónicas).
Sin embargo, tenga en cuenta que ahora solo muestra el gasto localmente después de que se haya escrito en el servidor. Si ese es un requisito para su caso de uso, entonces 👍. Pero al usar Firebase es bastante común:
onValue permanente en expenses para mostrar los gastos más recientes en la interfaz de usuario.then() : set(push(ref(db, "expenses")), expense);onValue local con el nuevo valor, asumiendo que la escritura se realizará correctamente.onValue con los datos corregidos, para que su interfaz de usuario pueda actualizar el estado.