内置中间件

静态文件处理

中间件通过文件系统 filesystem 来代理(处理)静态文件。 一旦文件不存在, 请求代理会转到下个中间件。如果你想要处理不存在的文件返回 404 File Not Found HTTP 错误, 请参考 http.FileServer 处理器吧.

列子:

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "net/http"
  6.  
  7. "github.com/urfave/negroni"
  8. )
  9.  
  10. func main() {
  11. mux := http.NewServeMux()
  12. mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
  13. fmt.Fprintf(w, "Welcome to the home page!")
  14. })
  15.  
  16. // http.FileServer的使用例子, 若你预期要"像伺服器"而非"中间件"的行为
  17. // mux.Handle("/public", http.FileServer(http.Dir("/home/public")))
  18.  
  19. n := negroni.New()
  20. n.Use(negroni.NewStatic(http.Dir("/tmp")))
  21. n.UseHandler(mux)
  22.  
  23. http.ListenAndServe(":3002", n)
  24. }

中间件首先从 /tmp 找文件,一旦在文件系统中找不到匹配的文件,代理将调用下一个文件。

恢复

本中间件接收 panic 跟错误代码 500 的响应。如果其他中间件写了响应代码或 Body 内容的话, 中间件会无法顺利地传送 500 错误给客户端, 因为客户端已经收到 HTTP 响应。另外, 可以 像 Sentry 或 Airbrake 挂载 PanicHandlerFunc 来报 500 错误给系统。

例子:

  1. package main
  2.  
  3. import (
  4. "net/http"
  5.  
  6. "github.com/urfave/negroni"
  7. )
  8.  
  9. func main() {
  10. mux := http.NewServeMux()
  11. mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
  12. panic("oh no")
  13. })
  14.  
  15. n := negroni.New()
  16. n.Use(negroni.NewRecovery())
  17. n.UseHandler(mux)
  18.  
  19. http.ListenAndServe(":3003", n)
  20. }

它将输出 500 Internal Server Error 给每个请求. 如果 PrintStack 设成 true (默认值)的话,它也会把错误日志写入请求方追踪堆栈。

加错误处理器的例子:

  1. package main
  2.  
  3. import (
  4. "net/http"
  5.  
  6. "github.com/urfave/negroni"
  7. )
  8.  
  9. func main() {
  10. mux := http.NewServeMux()
  11. mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
  12. panic("oh no")
  13. })
  14.  
  15. n := negroni.New()
  16. recovery := negroni.NewRecovery()
  17. recovery.PanicHandlerFunc = reportToSentry
  18. n.Use(recovery)
  19. n.UseHandler(mux)
  20.  
  21. http.ListenAndServe(":3003", n)
  22. }
  23.  
  24. func reportToSentry(info *negroni.PanicInformation) {
  25. // 在这写些程式回报错误给Sentry
  26. }

默认情况下,这个中间件会简要输出日志信息到 STDOUT 上。当然你也可以通过 SetFormatter() 函数自定义输出的日志。

当发生崩溃时,同样你也可以通过 HTMLPanicFormatter 来显示美化的 HTML 输出结果。

  1. package main
  2.  
  3. import (
  4. "net/http"
  5.  
  6. "github.com/urfave/negroni"
  7. )
  8.  
  9. func main() {
  10. mux := http.NewServeMux()
  11. mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
  12. panic("oh no")
  13. })
  14.  
  15. n := negroni.New()
  16. recovery := negroni.NewRecovery()
  17. recovery.Formatter = &negroni.HTMLPanicFormatter{}
  18. n.Use(recovery)
  19. n.UseHandler(mux)
  20.  
  21. http.ListenAndServe(":3003", n)
  22. }