2017-07-18 28 views
0

我試圖在我的項目中鏈處理程序。golang中間件

package main 

import (
    "database/sql" 
    "fmt" 
    "net/http" 
) 

func loggingHandler(next http.Handler) http.Handler { 
    fn := func(w http.ResponseWriter, r *http.Request) { 
     next.ServeHTTP(w, r) 
    } 
    return http.HandlerFunc(fn) 
} 

func loginHandler(res http.ResponseWriter, req *http.Request) { 
    if req.Method != "POST" { 
     http.ServeFile(res, req, "login.html") 
     return 
    } 
    // some code 
} 

func MainPageHandler(res http.ResponseWriter, req *http.Request) { 
    // some code 
} 

func main() { 
    db, err = sql.Open("", "[email protected]()/db name") 
    if err != nil { 
     fmt.Println(err) 
    } 
    defer db.Close() 
    commonHandlers := alice.New(loggingHandler) 
    http.Handle("/Login", commonHandlers.ThenFunc(loginHandler)) 
    http.Handle("/", commonHandlers.ThenFunc(MainPageHandler)) 
    http.ListenAndServe(":8080", nil) 
} 

我該怎麼做才能得到輸出? 在此先感謝。

+0

這已經做過很多次的去了。如果你想要一些輕巧的東西,並附帶一些「電池」,請瀏覽https://github.com/urfave/negroni,它非常流行,易於使用。記錄和從恐慌中恢復是標準的。 – reticentroot

+0

從panics中恢復已經是'net/http'中的標準。 – Adrian

+0

@嘗試發佈至少會編譯的代碼(除非您發佈有關編譯問題)。引用的代碼引用了未定義或導入的「alice」。 – Adrian

回答

0

通過傳遞http.ResponseWriter作爲第一個參數,請求處理程序可以使用任何fmtFprint* methods來編寫響應。

例如:

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path) 
}