go - 我有一个中间件链,但 Request BODY 与第一个链一起使用
问题描述
我有 2 个中间件和最终的 HandleFunc。
但 Request.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 请求体是一个流,你只能读取一次。您的第一个中间件读取正文,因此您的第二个中间件没有任何内容。
验证中间件中的主体可能不是您尝试做的最佳解决方案。我建议您删除中间件,解组处理程序中的主体,并将中间件重构为实用程序函数,您可以将解组消息传递到该实用程序函数中,以便它可以做它需要做的事情。
推荐阅读
- c++ - std::nth_element 是否保证在存在关系的情况下进行分区?
- jenkins - new File(...).eachFileRecurse() 在现有文件和文件夹上失败
- javascript - 使用整数列表的密度图
- python - 如何在使用 Python 脚本执行期间读取 Jenkins 管道控制台输出?
- selenium - 在壁虎驱动程序的帮助下尝试执行第一个脚本以打开 Web url 时出现以下错误 -
- java - 通过调用Java中的方法从文件中读取,一次一个字
- jquery - 使用 jquery 的电子邮件验证标签输入(使用标签不是正常输入)
- google-cloud-platform - PARSE_DATETIME 格式与一年中的某一天
- r - 函数和参数之间是否可能发生命名空间冲突?
- tensorflow - weight_quant/min,检查点恢复的max与实际的min/max不同