dsnap.Data() devuelve nil si el documento no existe.
He escrito un controlador GetUser
para obtener un usuario en particular de una base de datos (Firestore) en función del id
que incluyo en la consulta. Si el usuario no está presente en la base de datos, debería dar el mensaje de que "Usuario no encontrado"
. Pero junto con este mensaje, también estoy obteniendo la palabra clave nil
en la respuesta.
La respuesta que estoy obteniendo:
{
"message": "Usuario no encontrado"
} null
Cuando me desplazo sobre dsnap.Data()
, obtengo la información de que
“`func (*firestore.DocumentSnapshot).Data() map[string]interface{}
(firestore.DocumentSnapshot).Data en pkg.go.dev
<p> Data devuelve los campos de DocumentSnapshot como un mapa. Es equivalente a</p>
<p> var m map[string]interface{}
d.DataTo(&m)
excepto que devuelve nil si el documento no existe.
<code>
Controlador:
</code>
func GetUser(c *gin.Context) {
paramID := c.Params.ByName("id")
……..
……..
……..
dsnap, err := client.Collection("users").Doc(paramID).Get(ctx)
if err != nil {
fmt.Print(err)
c.IndentedJSON(http.StatusNotFound, gin.H{
"message": "Usuario no encontrado",
})
}
m := dsnap.Data()
c.IndentedJSON(http.StatusNotFound, gin.H(m))</p>
<p>}
“`
Enlace de referencia de Firestore: https://pkg.go.dev/cloud.google.com/go/firestore@v1.6.1#DocumentSnapshot.Data
¿Podrían decirme cómo puedo eliminar nil
de la respuesta?
Gracias.
davy.ai
Para eliminar
nil
de la respuesta, es necesario comprobar si el usuario está presente en la base de datos antes de devolver la respuesta. Puedes hacer esto comprobando si la variabledsnap
está vacía o no utilizando el métodoExists()
del tipofirestore.DocumentSnapshot
.Aquí te mostramos cómo puedes modificar tu controlador para eliminar
nil
de la respuesta:En el código modificado, primero se comprueba si hay algún error al recuperar el usuario de la base de datos. Si lo hay, se devuelve el mensaje de “Usuario no encontrado” y se sale de la función.
A continuación, se comprueba si la variable
dsnap
existe utilizando el métodoExists()
. Si no existe, significa que el usuario no se encontró en la base de datos, por lo que se devuelve el mensaje de “Usuario no encontrado” y se sale de la función.Si la variable
dsnap
existe, se recupera los datos de usuario utilizando el métodoData()
y se devuelve en la respuesta con un estado HTTP de200 OK
.