gpt4 book ai didi

go - 我有一个中间件链,但 Request BODY 与第一个链一起工作

转载 作者:行者123 更新时间:2023-12-01 22:26:28 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Golang read request body multiple times [duplicate]

(2 个回答)


2年前关闭。




我有 2 个中间件和最终的 HandleFunc。

但 Request.Body 仅适用于第一个中间件。当第二个开始时, body 是空的。

会发生什么?

这是我对路线的呼吁。

router.HandleFunc("/registro", middleW.Validaciones(middleW.UsuarioYaExiste(routes.Registro))).Methods("POST")

第一个中间件是
func Validaciones (next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {

if bd.ChequeoConnection()==0 {
http.Error(w,"Conexión Perdida con la Base de Datos",500)
return
}

var t models.Usuario
err := json.NewDecoder(r.Body).Decode(&t)
http.Error(w,"Nombre "+t.Nombre+" - Email "+t.Email+" - Password "+t.Password, 400)
if err != nil {
mensaje:="Validaciones : Usuario y/o Contraseña inválidos <br> Password ="+t.Password+"<br>Email = "+t.Email+"<br>Nombre = "+t.Nombre
http.Error(w, mensaje, 400)
return
}

if len(t.Email)==0 {
http.Error(w, "El email de usuario es requerido", 400)
return
}

if len(t.Password)<6 {
http.Error(w, "Debe especificar una contraseña de al menos 6 caracteres", 400)
return
}

/* si todo estuvo OK devuelve la función de la Ruta */
next.ServeHTTP(w, r)
}
}

这是第二个中间件
func UsuarioYaExiste (next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var t models.Usuario
err := json.NewDecoder(r.Body).Decode(&t)

http.Error(w,"Nombre 1ro. "+t.Nombre+" - Email "+t.Email+" - Password "+t.Password, 400)

if err != nil {
mensaje:="UsuarioYaExiste : Usuario y/o Contraseña inválidos <br> Password ="+t.Password+"<br>Email = "+t.Email+"<br>Nombre = "+t.Nombre
http.Error(w, mensaje, 400)
return
}

existe := bd.ChequeoYaExisteUsuario(t.Email)
if existe == true && r.Method == "POST" {
http.Error(w, "ya existe un usuario con ese email", 400)
return
}

if existe == false && r.Method == "GET" {
http.Error(w, "Usuario no existe", 400)
return
}

/* si todo estuvo OK devuelve la función de la Ruta */
next.ServeHTTP(w, r)
}
}

在第二个中间件中,
这条线
http.Error(w,"Nombre 1ro. "+t.Nombre+" - Email "+t.Email+" - Password "+t.Password, 400)

显示空值,但不在第一个中间件中。

最佳答案

HTTP 请求体是一个流,你只能读取一次。您的第一个中间件读取正文,因此您的第二个中间件没有任何内容。

验证中间件中的主体可能不是您尝试做的最佳解决方案。我建议您删除中间件,解码处理程序中的主体,并将中间件重构为实用程序函数,您可以将解码的消息传递到该实用程序函数中,以便它可以做它需要做的事情。

关于go - 我有一个中间件链,但 Request BODY 与第一个链一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59725904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com