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.

Error: La interfaz debe ser un puntero a una estructura. Error devuelto en una fibra (golang), ¿cómo resolver esto?

Soy nuevo en la programación de Golang
Estoy enfrentando un problema..
Estoy intentando acceder a los datos de mi cuerpo enviado por la función “BodyParser”
Pero obtengo un error.

esquema: la interfaz debe ser un puntero a una estructura

A continuación, se muestra la función que estoy proporcionando:

func CreateService(c *fiber.Ctx) error {
    if c.Locals("user_type") != "1" {
        return c.SendString("Incorrecto")
    }

    file, err := c.FormFile("imagen")

    // Comprobar errores:
    if err != nil {
        fmt.Println(err.Error())
        return c.JSON("Error algo")
    }
    // 👷 Guardar archivo en el directorio raíz:
    c.SaveFile(file, fmt.Sprintf("./%s", file.Filename))
    // 👷 Guardar archivo dentro de la carpeta uploads en el directorio de trabajo actual:
    c.SaveFile(file, fmt.Sprintf("./uploads/%s", file.Filename))
    // 👷 Guardar archivo usando una ruta relativa:
    c.SaveFile(file, fmt.Sprintf("/tmp/uploads_relative/%s", file.Filename))

    var data map[string]string

    if err := c.BodyParser(&data); err != nil {
        return err
    }

    service := models.Services{
        Title: data["title"],
        Src:   PORT + "/" + file.Filename,
    }
    database.DB.Create(&service)

    return c.JSON(service)
}

Services en el modelo es:

type Services struct {
    Id    uint   `json:"id"`
    Title string `json:"title"`
    Src   string `json:"src"`
}

Por favor, ayúdame. ¡Gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema ocurre cuando intentas analizar el cuerpo de la solicitud utilizando la función BodyParser(). Según el mensaje de error, la interfaz debe ser un puntero a struct, lo que significa que la variable de datos que estás utilizando para almacenar el cuerpo analizado debería ser un puntero a struct y no un mapa.

    Para resolver este problema, puedes definir un struct que coincida con los campos en tu cuerpo de solicitud y usar un puntero a ese struct al analizar el cuerpo.

    Aquí tienes un ejemplo de cómo puedes modificar tu código:

    type ServiceRequest struct {
        Title string `json:"title"`
    }
    
    func CreateService(c *fiber.Ctx) error {
        if c.Locals("user_type") != "1" {
            return c.SendString("Wrong One")
        }
    
        file, err := c.FormFile("image")
    
        // Comprobar errores:
        if err != nil {
            fmt.Println(err.Error())
            return c.JSON("Something error")
        }
    
        // Guardar archivo utilizando una ruta relativa:
        c.SaveFile(file, fmt.Sprintf("/tmp/uploads_relative/%s", file.Filename))
    
        var req ServiceRequest
    
        if err := c.BodyParser(&req); err != nil {
            return err
        }
    
        service := models.Services{
            Title: req.Title,
            Src:   PORT + "/" + file.Filename,
        }
    
        database.DB.Create(&service)
    
        return c.JSON(service)
    }
    

    En este ejemplo, hemos definido un struct llamado ServiceRequest que solo incluye el campo title de tu cuerpo de solicitud. Luego utilizamos un puntero a este struct al analizar el cuerpo de la solicitud utilizando la función BodyParser(). Finalmente, utilizamos el campo title del cuerpo de la solicitud analizado para crear un nuevo objeto models.Services.

    ¡Espero que esto ayude! Avísame si tienes alguna pregunta.

Comments are closed.