首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Go Gorilla复用器MiddlewareFunc与r.Use和返回错误

Go Gorilla复用器MiddlewareFunc与r.Use和返回错误
EN

Stack Overflow用户
提问于 2019-01-30 22:54:09
回答 1查看 2.2K关注 0票数 0

如何设置Gorilla Mux r.Use在中间件链中返回错误?https://godoc.org/github.com/gorilla/mux#Router.Use

Main.go

代码语言:javascript
运行
复制
r := mux.NewRouter()

r.Use(LoggingFunc)
r.Use(AuthFunc)

基础中间件

从日志记录中间件开始,它可以捕获和处理链中更下层的错误

代码语言:javascript
运行
复制
type HandlerFunc func(w http.ResponseWriter, r *http.Request) error

func LoggingFunc(next HandlerFunc) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // Logging middleware

        defer func() {
            if err, ok := recover().(error); ok {
                w.WriteHeader(http.StatusInternalServerError)
            }
        }()

        err := next(w, r)
        if err != nil {
            // log error
        }
    })
}

下一个中间件处理身份验证,并向日志中间件返回错误。

代码语言:javascript
运行
复制
func AuthFunc(next HandlerFunc) HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) error {

        if r.GET("JWT") == "" {
            return fmt.Errorf("No JWT")
        }

        return next(w, r)
    }
}

我一直收到这样的错误

代码语言:javascript
运行
复制
  cannot use AuthFunc (type func(handlers.HandlerFunc) http.Handler) as type mux.MiddlewareFunc in argument to r.Use

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-31 01:00:07

根据mux.Use doc,它的参数类型是MiddlewareFunc,返回类型是http.Handler,而不是错误类型。您必须定义哪个返回类型是http.HandlerFunc

代码语言:javascript
运行
复制
type Middleware func(http.HandlerFunc) http.HandlerFunc

func main() {
    r := mux.NewRouter()

    //  execute middleware from right to left of the chain
    chain := Chain(SayHello, AuthFunc(), LoggingFunc())
    r.HandleFunc("/", chain)

    println("server listening :  8000")
    http.ListenAndServe(":8000", r)
}

// Chain applies middlewares to a http.HandlerFunc
func Chain(f http.HandlerFunc, middlewares ...Middleware) http.HandlerFunc {
    for _, m := range middlewares {
        f = m(f)
    }
    return f
}

func LoggingFunc() Middleware {
    return func(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            // Loggin middleware

            defer func() {
                if _, ok := recover().(error); ok {
                    w.WriteHeader(http.StatusInternalServerError)
                }
            }()

            // Call next middleware/handler in chain
            next(w, r)
        }
    }
}

func AuthFunc() Middleware {
    return func(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {

            if r.Header.Get("JWT") == "" {
                fmt.Errorf("No JWT")
                return
            }

            next(w, r)
        }
    }

}

func SayHello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello client")
}

在传递完所有这些中间件后,它将执行LogginFuncAuthFuncSayHello方法,这是您想要的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54443388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档