Tengo una consulta de base de datos de Firebase Realtime escrita con la versión 8 de Firebase que quiero migrar al SDK v9.
export const getSingleDataWithQuery = async ({ key, email, criteria }) => { if (!criteria) return; const snapshot = await realTimeDb .ref() .child(key) .orderByChild(query) .equalTo(criteria) .get(); const val = snapshot.val(); if (val) { const keys = Object.keys(val); return val[keys[0]]; } return null; };En este ejemplo:
Usando los datos de lectura de Firebase una vez y la documentación de clasificación de datos , logré reducirlo a tal vez esto, pero no estoy seguro de si es correcto:
export const getSingleDataWithQuery = async ({ key, query, criteria }) => { if (!criteria) return; const dbRef = query(ref(realTimeDb, key), orderByChild(email), equalTo(criteria)); get(dbRef).then(snapshot => { if (snapshot.exists()) { const val = snapshot.val(); if (val) { const keys = Object.keys(val); return val[keys[0]]; } } }); return null; };Además del hecho de que es posible que haya intercambiado la query y el email en los fragmentos, la única diferencia está en la forma en que maneja la llamada a la base de datos asincrónica y eso probablemente explica la diferencia. Dado que utiliza then en el segundo fragmento, la función en realidad no devuelve una promesa, por lo que llamarla con await it en la persona que llama no tendrá ningún efecto.
Para que vuelvan a ser iguales, usa await en el segundo fragmento también, en lugar de then :
export const getSingleDataWithQuery = async ({ key, query, criteria }) => { if (!criteria) return; const dbRef = query(ref(realTimeDb, key), orderByChild(email), equalTo(criteria)); const snapshot = await get(dbRef); // 👈 if (snapshot.exists()) { const val = snapshot.val(); if (val) { const keys = Object.keys(val); return val[keys[0]]; } } return null; };