Go 我有一个中间件链,但请求体与第一个中间件链一起工作
我有两个中间工具和最后一个把手 但是Request.Body只在第一个中间件中起作用。第二次启动时,主体为空 会发生什么 这是我的路线Go 我有一个中间件链,但请求体与第一个中间件链一起工作,go,Go,我有两个中间工具和最后一个把手 但是Request.Body只在第一个中间件中起作用。第二次启动时,主体为空 会发生什么 这是我的路线 router.HandleFunc("/registro", middleW.Validaciones(middleW.UsuarioYaExiste(routes.Registro))).Methods("POST") 第一个中间件是 func Validaciones (next http.HandlerFunc) http.HandlerFunc {
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)
}
}
显示空值,但不显示在第一个中间件中。HTTP请求主体是一个流,您只能读取一次。第一个中间件读取主体,因此第二个中间件没有剩余内容
验证中间件中的主体可能不是您尝试执行的最佳解决方案。我建议您删除中间件,在处理程序中解组正文,并将中间件重构为一个实用函数,您可以将解组消息传递到该函数中,以便它可以执行它需要执行的操作。这是否回答了您的问题?您好,谢谢您的回答,但是中间件的精神是拦截调用、处理调用并将控制传递给第二个中间件。所有HandleFunc都将请求作为参数。。。为什么尸体会丢失?尸体是一条小溪。你只能读一次。通常,中间件用于查看头、cookie、记录请求等,而不是主体。HandleFunc通常是您读取正文、处理正文并编写响应的地方。HandleFunc将请求作为参数是什么意思?它具有响应编写器和请求作为参数,与中间件funcs相同。
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)