【问题标题】:Does gorilla mux subrouters inherit the middlewares of their parent router?gorilla mux 子路由器是否继承其父路由器的中间件?
【发布时间】:2022-06-21 21:21:32
【问题描述】:

整个问题都在标题中。

如果子路由器将使用其父路由器的中间件,我正在搜索 SO,如果中间件通过 Use() 方法应用于父路由器,但我找不到明确简洁的答案。

我也无法在包文档中找到该信息,因此我决定对其进行测试并在此处为同一案例中的每个人发布问题和答案。

在下面的代码示例中,在/john 上请求会触发 logMiddleware 吗?

mainRouter := mux.NewRouter()
mainRouter.Use(logMiddleware)
subRouter := mainRouter.PathPrefix("/users/").Subrouter()
subRouter.Handle("/john", johnHandler())

【问题讨论】:

    标签: go middleware router gorilla mux


    【解决方案1】:

    是的,当使用Use() 方法应用时,mux 子路由器会继承其父级的中间件。

    如果您想在自己喜欢的 IDE 中尝试,这是我创建的测试:

    路由器代码

    package so
    
    import (
        "context"
        "net/http"
    
        "github.com/gorilla/mux"
    )
    
    func newRouter(useMainMiddleware bool) mux.Router {
        mainRouter := mux.NewRouter()
        if useMainMiddleware {
            mainRouter.Use(middleware)
        }
        subRouter := mainRouter.PathPrefix("/users/").Subrouter()
        subRouter.Handle("/test", testHandler())
        return *mainRouter
    }
    
    func middleware(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            r = r.WithContext(context.WithValue(r.Context(), "is_using_middleware", true))
            next.ServeHTTP(w, r)
        })
    }
    
    func testHandler() http.Handler {
        return http.HandlerFunc(
            func(w http.ResponseWriter, r *http.Request) {
                if using, castOk := r.Context().Value("is_using_middleware").(bool); castOk && using {
                    w.WriteHeader(http.StatusOK)
                    return
                }
                w.WriteHeader(http.StatusInternalServerError)
                return
            },
        )
    }
    

    测试文件

    package so
    
    import (
        "net/http"
        "net/http/httptest"
        "testing"
    
        "github.com/stretchr/testify/assert"
    )
    
    func TestSubrouterWithMiddleware(t *testing.T) {
        // GIVEN
        request := httptest.NewRequest(http.MethodGet, "/users/test", nil)
        recorder := httptest.NewRecorder()
        router := newRouter(true) // using a middleware
        // WHEN
        router.ServeHTTP(recorder, request)
        // THEN
        assert.Equal(t, http.StatusOK, recorder.Result().StatusCode)
    }
    
    func TestSubrouterWithoutMiddleware(t *testing.T) {
        // GIVEN
        request := httptest.NewRequest(http.MethodGet, "/users/test", nil)
        recorder := httptest.NewRecorder()
        router := newRouter(false) // not using a middleware
        // WHEN
        router.ServeHTTP(recorder, request)
        // THEN
        assert.Equal(t, http.StatusInternalServerError, recorder.Result().StatusCode)
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2016-04-07
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2017-11-07
      • 1970-01-01
      相关资源
      最近更新 更多