Чтобы убедиться, что результаты ошибок обрабатываются правильно для всех запросов, я реализую собственный обработчик, как описано в http://blog.golang.org/error-handling-and-go. Таким образом, вместо того, чтобы принимать только параметры w http.ResponseWriter, r *http.Request
, обработчик необязательно возвращает error
.
Я использую Negroni и задаюсь вопросом, могу ли я настроить его один раз, чтобы оборачивать все запросы в handler
, или его всегда нужно будет настраивать для каждого запроса, как это сделано для /
и /foo
в следующем примере?
type handler func(w http.ResponseWriter, r *http.Request) error
// ServeHTTP checks for error results and handles them globally
func (fn handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if err := fn(w, r); err != nil {
http.Error(w, err, http.StatusInternalServerError)
}
}
// Index matches the `handler` type and returns an error
func Index(w http.ResponseWriter, r *http.Request) error {
return errors.New("something went wrong")
}
func main() {
router := mux.NewRouter()
// note how `Index` is wrapped into `handler`. Is there a way to
// make this global? Or will the handler(fn) pattern be required
// for every request?
router.Handle("/", handler(Index)).Methods("GET")
router.Handle("/foo", handler(Index)).Methods("GET")
n := negroni.New(
negroni.NewRecovery(),
negroni.NewLogger(),
negroni.Wrap(router),
)
port := os.Getenv("PORT")
n.Run(":" + port)
}