内置中间件
静态文件处理
中间件通过文件系统 filesystem 来代理(处理)静态文件。 一旦文件不存在, 请求代理会转到下个中间件。如果你想要处理不存在的文件返回 404 File Not Found
HTTP 错误, 请参考 http.FileServer 处理器吧.
列子:
- package main
- import (
- "fmt"
- "net/http"
- "github.com/urfave/negroni"
- )
- func main() {
- mux := http.NewServeMux()
- mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
- fmt.Fprintf(w, "Welcome to the home page!")
- })
- // http.FileServer的使用例子, 若你预期要"像伺服器"而非"中间件"的行为
- // mux.Handle("/public", http.FileServer(http.Dir("/home/public")))
- n := negroni.New()
- n.Use(negroni.NewStatic(http.Dir("/tmp")))
- n.UseHandler(mux)
- http.ListenAndServe(":3002", n)
- }
中间件首先从 /tmp
找文件,一旦在文件系统中找不到匹配的文件,代理将调用下一个文件。
恢复
本中间件接收 panic
跟错误代码 500
的响应。如果其他中间件写了响应代码或 Body 内容的话, 中间件会无法顺利地传送 500 错误给客户端, 因为客户端已经收到 HTTP 响应。另外, 可以 像 Sentry 或 Airbrake 挂载 PanicHandlerFunc
来报 500 错误给系统。
例子:
- package main
- import (
- "net/http"
- "github.com/urfave/negroni"
- )
- func main() {
- mux := http.NewServeMux()
- mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
- panic("oh no")
- })
- n := negroni.New()
- n.Use(negroni.NewRecovery())
- n.UseHandler(mux)
- http.ListenAndServe(":3003", n)
- }
它将输出 500 Internal Server Error
给每个请求. 如果 PrintStack
设成 true
(默认值)的话,它也会把错误日志写入请求方追踪堆栈。
加错误处理器的例子:
- package main
- import (
- "net/http"
- "github.com/urfave/negroni"
- )
- func main() {
- mux := http.NewServeMux()
- mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
- panic("oh no")
- })
- n := negroni.New()
- recovery := negroni.NewRecovery()
- recovery.PanicHandlerFunc = reportToSentry
- n.Use(recovery)
- n.UseHandler(mux)
- http.ListenAndServe(":3003", n)
- }
- func reportToSentry(info *negroni.PanicInformation) {
- // 在这写些程式回报错误给Sentry
- }
默认情况下,这个中间件会简要输出日志信息到 STDOUT 上。当然你也可以通过 SetFormatter() 函数自定义输出的日志。
当发生崩溃时,同样你也可以通过 HTMLPanicFormatter 来显示美化的 HTML 输出结果。
- package main
- import (
- "net/http"
- "github.com/urfave/negroni"
- )
- func main() {
- mux := http.NewServeMux()
- mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
- panic("oh no")
- })
- n := negroni.New()
- recovery := negroni.NewRecovery()
- recovery.Formatter = &negroni.HTMLPanicFormatter{}
- n.Use(recovery)
- n.UseHandler(mux)
- http.ListenAndServe(":3003", n)
- }