我想将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/

10-08 22:22
查看更多