【问题标题】:Wrapping a handler with a middleware that has parameters with Go-chi使用带有 Go-chi 参数的中间件包装处理程序
【发布时间】:2021-01-11 22:28:33
【问题描述】:

我一直在尝试使用 go-chi 实现 this 教程,尤其是关于包装/将参数传递给包装器的部分。

我的目标是能够用带有自定义参数的中间件包装一些特定的路由,而不是让中间件对我的所有路由都是“全局的”,但我在做这件事时遇到了问题。

package main

import (
    "context"
    "io"
    "net/http"

    "github.com/go-chi/chi"
    "github.com/go-chi/chi/middleware"
)

func main() {

    r := chi.NewRouter()
    r.Use(middleware.Logger)

    r.Get("/user", MustParams(sayHello, "key", "auth"))

    http.ListenAndServe(":3000", r)
}


func sayHello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("hi"))
}

func MustParams(h http.Handler, params ...string) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        q := r.URL.Query()
        for _, param := range params {
            if len(q.Get(param)) == 0 {
                http.Error(w, "missing "+param, http.StatusBadRequest)
                return // exit early
            }
        }
        h.ServeHTTP(w, r) // all params present, proceed
    })
}

我收到cannot use sayHello (type func(http.ResponseWriter, *http.Request)) as type http.Handler in argument to MustParams: func(http.ResponseWriter, *http.Request) does not implement http.Handler (missing ServeHTTP method)

如果我尝试键入断言它,则执行r.Get("/user", MustParams(http.HandleFunc(sayHello), "key", "auth"))

我收到错误cannot use MustParams(http.HandleFunc(sayHello), "key", "auth") (type http.Handler) as type http.HandlerFunc in argument to r.Get: need type assertion

我似乎无法找到一种方法让它工作或能够用中间件包装单个路由。

【问题讨论】:

  • MustParams'返回类型从http.Handler更改为http.HandleFunc
  • 也试过了,cannot use sayHello (type func(http.ResponseWriter, *http.Request)) as type http.Handler in argument to MustParams: func(http.ResponseWriter, *http.Request) does not implement http.Handler (missing ServeHTTP method)
  • 返回类型,而不是参数类型。
  • 你的意思是func MustParams(h http.Handler, params ...string) http.HandlerFunc { 吗?因为我就是这么做的
  • 是的,你仍然需要以http.HandleFunc(sayHello)作为第一个参数来调用它。

标签: http go handler middleware go-chi


【解决方案1】:

有一个函数http.HandleFunc,然后有一个类型http.HandlerFunc。您使用的是前者,但您需要后者。

r.Get("/user", MustParams(http.HandlerFunc(sayHello), "key", "auth"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-26
    • 2021-09-20
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多