Aquí está mi código:
function loginHandler() { firestore.collection("users").forEach(user => { if (user.username === queryUsername && user.password === queryPassword) { navigate("/"); } else { setMode("INCORRECT") } }) }
Estoy tratando de verificar si un documento en la colección de usuarios de mi base de datos firestore tiene la propiedad de nombre de usuario de queryUsername y la propiedad de contraseña de queryPassword. Cuando ejecuto esta función:
function loginHandler() { if (firestore.collection("users").doc("doc that definetly doesnt exist")) { console.log("exists") } else { console.log("doesnt exist") } }
Se registra existe por alguna razón
1. Comenzando con el segundo fragmento de código
firebase.collection("someCollection").doc("some docID which might exist or not")
El código anterior devuelve un objeto o una instantánea de acuerdo con firebase que le brinda información sobre el documento que está buscando, ya sea que exista o no. Por implicación de código, su código siempre devolverá que el documento existe ya que un objeto pasado a una declaración if siempre es verdadero. De la documentación oficial de firebase, esta será la forma de resolver esto.
firebase.collection("SomeCollection").doc("some document ID which exists or not").get() .then((user)=>{ if(user.exists){ console.log("exists"); } else{ console.log("doesn't exists"); } })
2. Del primer fragmento de código
ALGUNAS NOTAS Desde el punto de vista de las cosas, desea realizar algún tipo de autenticación, aunque almacenar la contraseña real de los usuarios es muy arriesgado y una mala práctica, si desea almacenar la contraseña, puede codificarla, pero con fines ilustrativos, usaré su código de muestra. .
El primer fragmento de código obtiene todo el documento de la base de datos de Firebase y realiza la verificación en el lado del cliente, esto es ineficiente y no será una buena práctica suponiendo que el tamaño de su colección sea infinito, intentaré arreglar su código y luego proporcionar una mejor solución
Su solución de código Cuando lee una colección de firebase, lo que obtiene son instantáneas de documentos, debe llamar a .data() en cada instantánea para obtener el documento real almacenado en firebase. Su solución de código ahora será así, suponiendo que los nombres de usuario y las contraseñas se almacenen sin formato
function loginHandler() { firestore.collection("users").get().then(users => { users.forEach((user)=>{ if (user.data().username === queryUsername && user.data().password === queryPassword) { navigate("/"); } else { setMode("INCORRECT") } }) }) }
el eficiente
La forma más eficiente es ejecutar estos códigos desde el nivel de la base de datos, en ese caso, no tiene que acumular costos a medida que su aplicación crece para lecturas de documentos.
firestore.collection("users").where("username","==",queryUsername) .where("password","==",querypassword).limit(1).get() .then((result)=>{ if(result.exists){ console.log("do something after users creds are ok") }else{ console.log("do something if not ok") } })
Tenga en cuenta que de la respuesta debe crear un índice compuesto de campo de nombre de usuario y contraseña en su consola de Firestore. Compruébelo aquí.
El límite que utilicé no es intencional, por lo que solo puedo devolver un documento que coincida y llamar a .exists en la instantánea; de lo contrario, devolverá una matriz de instantáneas, incluso si solo se puede encontrar un documento.