gpt4 book ai didi

google-app-engine - 去包装 httprouter 有记录器?

转载 作者:数据小太阳 更新时间:2023-10-29 03:28:58 24 4
gpt4 key购买 nike

我有以下 httprouter 处理程序,但我想自定义以便我可以注入(inject)我自己的记录器函数。

router := httprouter.New()
router.Handle("GET", "/mysite", mylogger(handler1))

mylogger 就像:

var logger = log.New(os.Stdout, "[Log] ", 0)
func mylogger(fn func(w http.ResponseWriter, r *http.Request, param httprouter.Params)) func(w http.ResponseWriter, r *http.Request, param httprouter.Params) {
return func(w http.ResponseWriter, r *http.Request, param httprouter.Params) {
start := time.Now()
logger.Printf("%s %s", r.Method, r.URL.Path)
fn(w, r, param)
logger.Printf("Done in %v (%s %s)", time.Since(start), r.Method, r.URL.Path)
}
}

myhandler 就像:

func myhandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
....
}

有什么方法可以包装 httprouter 处理程序,而不必将处理程序传递给 mylogger 函数?我想在 Go AppEngine Context 中做一些类似的事情:

func AppEngineHandler(c appengine.Context, w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
...
c.Infof("Here's my log")
}

最佳答案

如果之前没有使用过 httprouter 包,看起来您需要做的就是更改您尝试包装的函数签名。

因此,首先,更改方法中fn 参数的声明:

func mylogger(fn func(c *myapp.Context, w http.ResponseWriter, r *http.Request, param httprouter.Params))
// ^^^^^ have it accept a context of your own

..然后创建上下文并将其传递给包装器中的处理程序:

c := &myapp.Context{ your: arguments, here: true }
fn(c, w, r, param)
// ^^ - pass the context in

然后更改处理程序的签名:

func myhandler(c *myapp.Context, w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
// use c here
}

关于google-app-engine - 去包装 httprouter 有记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com