gpt4 book ai didi

go - 无法将 StripPrefix 包装在另一个函数中(缺少 ServeHTTP 方法)

转载 作者:IT王子 更新时间:2023-10-29 02:33:15 25 4
gpt4 key购买 nike

我想将 func StripPrefix 包装在另一个函数中,并在创建文件服务器之前进行一些客户端 session 检查。所有 session 都存储在一个 MySQL 数据库表中,用于为一个网站实现多个 Web 服务器。

func RegisterHandlers() {
http.Handle("/", fileHandler)
http.HandleFunc("/login", loginHandler)
}

func fileHandler() http.Handler {
//Check session in the database
return http.StripPrefix("/", http.FileServer(http.Dir("client/index")))
}

错误信息

错误消息说缺少 ServeHTTP 方法。我不明白为什么,因为我只是将它包装在另一个函数中并准确返回 http.StripPrefix

./index.go:9: cannot use fileHandler (type func() http.Handler) as type http.Handler in argument to http.Handle:
func() http.Handler does not implement http.Handler (missing ServeHTTP method)

最佳答案

http.Handle 需要一个接受 http.ResponseWriter*http.Request 的函数。您的文件处理程序函数不采用这些参数中的任何一个。相反,您希望将从 调用 返回的处理程序传递给您的 fileHandler 函数。但是,如果您按原样执行此操作,您将只检查一次凭据,而不是在每次 HTTP 调用时检查,这可能不是您想要的。相反,您必须返回一个处理函数来包装您的 session 检查和对文件服务器 Handle 方法的调用。您甚至可以让它包装一个通用处理程序(类似于 StripPrefix 的工作方式),以便您可以重用它来检查 session 中是否有多种不同类型的请求。类似于以下内容:

func RegisterHandlers() {
http.Handle("/", checkSession(http.StripPrefix("/", http.FileServer(http.Dir("client/index")))))
http.HandleFunc("/login", loginHandler)
}

func checkSession(h http.Handler) http.Handler {
return HandlerFunc(func(w ResponseWriter, r *Request) {
//Check session in the database
h.ServeHTTP(w, r)
})
}

关于go - 无法将 StripPrefix 包装在另一个函数中(缺少 ServeHTTP 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38548778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com