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

时间:2016-07-24 04:33:29

标签: go interface

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

1 个答案:

答案 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)
    })
}