我想将func StripPrefix包装在另一个函数中,并在创建文件服务器之前进行一些客户端会话检查。所有会话都存储在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)
答案 0 :(得分:3)
http.Handle
需要一个http.ResponseWriter
和*http.Request
的函数。您的文件处理函数不接受这些参数中的任何一个。相反,您希望将从调用返回的处理程序传递给fileHandler函数。但是,如果按原样执行此操作,则只会检查一次凭据而不是每次HTTP调用,这可能不是您想要的。相反,您必须返回一个处理函数,它包装您的会话检查和对文件服务器Handle
方法的调用。您甚至可以将它包装为通用处理程序(类似于StripPrefix
的工作方式),以便您可以重复使用它来检查会话中的多种不同类型的请求。如下所示:
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)
})
}