No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Agregando Middlewares

34/42
Recursos

El profesor menciona la función AddMidleware, aquí te la dejamos.

func AddMidleware( f http.HandlerFunc, 
middlewares ...Middleware)
http.HandlerFunc {
for _, m := range middlewares {
f=(f)
}
return f
}

Aportes 14

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

¿En que momento se agrego la función AddMiddleware?

No se si es mi impresión pero en este video me acorde de JS y sus callback en el callback del callback…

type Middleware func(http.HandlerFunc) http.HandlerFunc

Se definió un type Middleware que recibe y retorne http.HandlerFunc así todas las funciones que cuenten con esta firma se considerarán de tipo Middleware. Reciben y retornan lo mismo, para poder encadenarse y pasar el request entre varios middleware, hasta llegar al handler.

Algo interesante de esta definición es como Middleware tiene un type func como parámetro, significa que recibirá una función como argumento que tiene una firma definida http.HandlerFunc.

El operador elipsis (…) sirve para determinar una cantidad variable de parametros de un mismo tipo.

// Va a recibir una cantidad variable de argumentos de tipo Middleware
func example (middlewares ...Middleware) {}

¿El middlewares es una pieza de software en medio de otras dos?

Aqui esta la funcion completa:

func AddMidleware(f http.HandlerFunc, middlewares ...Middleware) http.HandlerFunc {
	for _, m := range middlewares {
		f = m(f)
	}

	return f
}

Empezó explicando de atrás para adelante

func CheckAuth() Middleware {
...
}

Quiere decir que ++ checkAuth() hace return un Middleware ++, no qué CheckAuth() es de tipo middleware. O me equivoco? (03:00)

Me tomo un poco de tiempo entender esto, aqui les dejo mis apuntes:

// checkAuth: funcion que no tiene parametros y devuelve una funcion de tipo Middleware
func CheckAuth() Middleware {

	// Aqui estamos haciendo return nuestro Middleware
	// (Middleware es una funcion que toma http.HandlerFunc como parametro 
	// y devuelve otra http.HandlerFunc)
	return func(f http.HandlerFunc) http.HandlerFunc {

		// Como Middleware devuelve un http.HandlerFunc, aqui estamos implementando 
		// ese HandlerFunc (http.HandlerFunc es una funcion que tiene 
		// http.ResponseWriter y *http.Request como parametros)
		return func(w http.ResponseWriter, r *http.Request) {
			flag := false
			fmt.Println("Checking Authentication")

			if flag {
				f(w, r)
			} else {
				return
			}
		}
	}
}

Lo que me quedo de esta clase es que al final los Middleware son Handlers también. Seguimos…

func (s *Server) AddMiddleware(f http.HandlerFunc, middlewares …Middleware) http.HandlerFunc {
for _, m := range middlewares {
f = m(f)
}
return f
}

Los middleware son handler que reciben cierta logica y determinar si siguen o no

Magasho

¿Por qué usamos el operador para indicar que vamos a mandar varios handlers y no usamos un slice como parámetro?

CheckAuth es un hilos de handler