es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 variable dsnap está vacía o no utilizando el método Exists() del tipo firestore.DocumentSnapshot.

    Aquí te mostramos cómo puedes modificar tu controlador para eliminar nil de la respuesta:

    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",
            })
            return
        }
    
        if !dsnap.Exists() {
            c.IndentedJSON(http.StatusNotFound, gin.H{
                "message": "Usuario no encontrado",
            })
            return
        }
    
        m := dsnap.Data()
        c.IndentedJSON(http.StatusOK, gin.H(m))
    }
    

    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étodo Exists(). 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étodo Data() y se devuelve en la respuesta con un estado HTTP de 200 OK.

Comments are closed.