获取马提尼酒中的请求url.上下文



我想给自己发电子邮件,但页面上出现错误http://localhost:3000/panic在我们的案例中包含错误url-/panic。但我不知道如何在RecoverWrap方法中从c martini.Context获取url。

package main
import (
    "errors"
    "github.com/go-martini/martini"
    "net/http"
)
func main() {
    m := martini.Classic()
    m.Use(RecoverWrap)
    m.Get("/panic", func() {
        panic("some panic")
    })
    m.Get("/", func(req *http.Request, res http.ResponseWriter) {
        res.Write([]byte("mainPage"))
    })
    m.Run()
}
func RecoverWrap(c martini.Context, w http.ResponseWriter) {
    var err error
    defer func(w http.ResponseWriter) {
        r := recover()
        if r != nil {
            switch t := r.(type) {
            case string:
                err = errors.New(t)
            case error:
                err = t
            default:
                err = errors.New("Unknown error")
            }
            // how to get request url here
            // I want to send email with error url
            http.Error(w, "Something goes wrong", http.StatusInternalServerError)
        }
    }(w)
    c.Next()
}

答案是在func RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter) 中添加req *http.Request参数

完整代码:

package main
import (
    "errors"
    "fmt"
    "github.com/go-martini/martini"
    "net/http"
)
func main() {
    m := martini.Classic()
    m.Use(RecoverWrap)
    m.Get("/panic", func() {
        panic("some panic")
    })
    m.Get("/", func(req *http.Request, res http.ResponseWriter) {
        res.Write([]byte("mainPage"))
    })
    m.Run()
}
func RecoverWrap(c martini.Context, req *http.Request, w http.ResponseWriter) {
    var err error
    defer func(w http.ResponseWriter) {
        r := recover()
        if r != nil {
            switch t := r.(type) {
            case string:
                err = errors.New(t)
            case error:
                err = t
            default:
                err = errors.New("Unknown error")
            }
            fmt.Println("req.URL.Path")
            fmt.Println(req.URL.Path)
            http.Error(w, "Something goes wrong", http.StatusInternalServerError)
        }
    }(w)
    c.Next()
}

最新更新