gpt4 book ai didi

go - httprouter 传入了很多中间件函数

转载 作者:IT王子 更新时间:2023-10-29 02:02:36 24 4
gpt4 key购买 nike

我来自 node express,我能够传递尽可能多的中间件,例如:routes.use('/*', ensureAuth, logImportant, ... n);

如何在使用 r.GET("/", HomeIndex) 时做类似的事情?

我是否被迫执行类似 EnsureAuth(HomeIndex) 的操作?因为我可以让它工作。不幸的是,我不确定在不将函数链接在一起的情况下添加任意数量的中间件的好方法是什么。

是否有更优雅的方式,以便我可以以某种方式使用可变类型函数来执行 r.GET("/", applyMiddleware(HomeIndex, m1, m2, m3, m4)?我是现在正在尝试,但我觉得有更好的方法来做到这一点。

我查看了 httprouter 问题页面,找不到任何东西:(

谢谢!

最佳答案

这是我如何做到的例子:

package main

import (
"context"
"fmt"
"log"
"net/http"

"github.com/julienschmidt/httprouter"
"github.com/justinas/alice"
)

// m1 is middleware 1
func m1(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
//do something with m1
log.Println("m1 start here")
next.ServeHTTP(w, r)
log.Println("m1 end here")
})
}

// m2 is middleware 2
func m2(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
//do something with m2
log.Println("m2 start here")
next.ServeHTTP(w, r)
log.Println("m2 end here")
})
}

func index(w http.ResponseWriter, r *http.Request) {
// get httprouter.Params from request context
ps := r.Context().Value("params").(httprouter.Params)
fmt.Fprintf(w, "Hello, %s", ps.ByName("name"))
}

// wrapper wraps http.Handler and returns httprouter.Handle
func wrapper(next http.Handler) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
//pass httprouter.Params to request context
ctx := context.WithValue(r.Context(), "params", ps)
//call next middleware with new context
next.ServeHTTP(w, r.WithContext(ctx))
}
}

func main() {
router := httprouter.New()

chain := alice.New(m1, m2)

//need to wrap http.Handler to be compatible with httprouter.Handle
router.GET("/user/:name", wrapper(chain.ThenFunc(index)))

log.Fatal(http.ListenAndServe(":9000", router))
}

代码链接(您不能从 play.golang.org 运行它):https://play.golang.org/p/BOCt97xcoY

关于go - httprouter 传入了很多中间件函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47151085/

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