为了账号安全,请及时绑定邮箱和手机立即绑定

将自定义中间件类型传递给 alice.New() 函数时构建失败

将自定义中间件类型传递给 alice.New() 函数时构建失败

Go
汪汪一只猫 2022-05-18 16:01:47
这是关于我在尝试构建应用程序时遇到的错误。我使用 Gorilla mux 作为路由器,使用 Alice 链接中间件。我使用以下签名定义了一个名为“中间件”的自定义类型;type Middleware func(http.Handler) http.Handler以下是我使用 Alice 链接中间件和处理程序的代码。if len(config.Middlewares()) > 0 {    subRouter.Handle(config.Path(), alice.New(config.Middlewares()...).Then(config.Handler())).Methods(config.Methods()...).Schemes(config.Schemes()...)}但是当我尝试构建时,我在控制台中收到以下错误;infrastructure/router.go:88:63: cannot use config.Middlewares() (type []Middleware) as type []alice.Constructor in argument to alice.New我检查了 alice.Constructor 的代码。它还具有与我的中间件类型相同的签名。我正在使用Go 1.13和以下版本的 Alice。github.com/justinas/alice v1.2.0你能帮我解决这个问题吗?
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

alice.Constructor具有相同的签名但它被定义为另一种类型。所以你不能只使用它。


观看此https://www.youtube.com/watch?v=Vg603e9C-Vg 它有一个很好的解释。


你可以做的是这样使用type aliases :


var Middleware = alice.Constructor

看起来像这样:


前:



func timeoutHandler(h http.Handler) http.Handler {

    return http.TimeoutHandler(h, 1*time.Second, "timed out")

}


func myApp(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("Hello world!"))

}


type Middleware func(http.Handler) http.Handler


func main() {

    middlewares := []Middleware{timeoutHandler}


    http.Handle("/", alice.New(middlewares...).ThenFunc(myApp))

}


后:


func timeoutHandler(h http.Handler) http.Handler {

    return http.TimeoutHandler(h, 1*time.Second, "timed out")

}


func myApp(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("Hello world!"))

}


type Middleware = alice.Constructor


func main() {

    middlewares := []Middleware{timeoutHandler}


    http.Handle("/", alice.New(middlewares...).ThenFunc(myApp))

}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信