go-gin:组合路线组
go-gin: combine group of routes
我是一名nodejs开发者,目前正在学习golang以扩展我的知识。在express中我们可以使用路由器作为中间件。
使用特定的中间件创建用户路由器:
// ** routes/userRoutes.js
// import authontication
// import handlers
const userRoutes = express.Router()
userRoutes.use(auth.protect) // ** middleware here
userRoutes.get('/', handlers.getUsers}
userRoutes.post('/create-voter', handlers.createUser}
export default userRoutes
我们可以在app.js中使用这条路由作为中间件。 (也许我措辞不正确)
// app.js
const app = express();
app.use(express.json()); // a middleware
app.use(morgan('dev')); // a middleware
app.use('/api/users', userRoutes) // route as middleware
这样每条路由(例如 'users'、'reviews')都可以与特定的中间件和端点放在一个文件中。
我试图在 gin-gonic/gin 中实现相同的逻辑。
我试过了:
func bookRoutesInit() *gin.Engine {
route := gin.New()
route.GET("/users", controllers.GetBooks)
return route
}
func startServer() {
app := gin.New()
bookRoutes := bookRoutesInit()
utils.ConnectDatabase()
app.Use(bookRoutes) /*
Error: cannot use bookRoutes (variable of type *gin.Engine)
as gin.HandlerFunc value in argument to app.Use
*/
app.Run(":5500")
}
我发现只有gin.HandlerFunc
可以用作中间件。我需要杜松子酒中的 express.Router
之类的东西。欢迎任何帮助或建议
我认为您可以创建一个名为 MyRoutes() 的函数,其中包含许多路由,并在另一个文件夹中创建 handlerFunc。
func Test() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("test")
c.String(http.StatusOK, "test")
}
}
func MyRoutes() {
r := gin.Default()
r.GET("/test", Test())
r.Run()
}
或者你可以调用你的函数,因为中间件 gin 要求是你知道的 HandlerFunc 类型。
func main() {
// Creates a router without any middleware by default
r := gin.New()
r.Use(Test())
...
查看更多关于gin中间件的信息
https://github.com/gin-gonic/gin#using-middleware
我是这样解决的。在 之后,我创建了一个超级组 ("/api/v1"),然后在其下添加了子组("users"、"books")。我能够将子组放入不同的文件中,并向它们发送 gin.RouterGroup()
的单个实例。结果我有了这个漂亮干净的文件夹结构:
controllers/
user_controllers
book_controllers
routes/
user_routes
book_rontrollers
index
middlewares/
all
main.go
main.go
func startServer() {
app := gin.New()
router := app.Group("/api/v1")
routes.AddRoutes(router)
utils.ConnectDatabase()
app.Run(":5500")
}
routes/book_routes.go
package routes
func bookRoutes(superRoute *gin.RouterGroup) {
booksRouter := superRoute.Group("/books")
{
booksRouter.GET("/", controllers.BookControllers.GetBooks)
booksRouter.POST("/", controllers.BookControllers.CreateBook)
}
}
routes/user_routes.go
package routes
func userRoutes(superRoute *gin.RouterGroup) {
booksRouter := superRoute.Group("/users")
{
booksRouter.GET("/", controllers.UserControllers.GetUsers)
booksRouter.POST("/", controllers.UserControllers.CreateUser)
}
}
routes/index.go
func AddRoutes(superRoute *gin.RouterGroup) {
bookRoutes(superRoute)
userRoutes(superRoute)
}
感谢 Whosebug 社区
我是一名nodejs开发者,目前正在学习golang以扩展我的知识。在express中我们可以使用路由器作为中间件。
使用特定的中间件创建用户路由器:
// ** routes/userRoutes.js
// import authontication
// import handlers
const userRoutes = express.Router()
userRoutes.use(auth.protect) // ** middleware here
userRoutes.get('/', handlers.getUsers}
userRoutes.post('/create-voter', handlers.createUser}
export default userRoutes
我们可以在app.js中使用这条路由作为中间件。 (也许我措辞不正确)
// app.js
const app = express();
app.use(express.json()); // a middleware
app.use(morgan('dev')); // a middleware
app.use('/api/users', userRoutes) // route as middleware
这样每条路由(例如 'users'、'reviews')都可以与特定的中间件和端点放在一个文件中。
我试图在 gin-gonic/gin 中实现相同的逻辑。 我试过了:
func bookRoutesInit() *gin.Engine {
route := gin.New()
route.GET("/users", controllers.GetBooks)
return route
}
func startServer() {
app := gin.New()
bookRoutes := bookRoutesInit()
utils.ConnectDatabase()
app.Use(bookRoutes) /*
Error: cannot use bookRoutes (variable of type *gin.Engine)
as gin.HandlerFunc value in argument to app.Use
*/
app.Run(":5500")
}
我发现只有gin.HandlerFunc
可以用作中间件。我需要杜松子酒中的 express.Router
之类的东西。欢迎任何帮助或建议
我认为您可以创建一个名为 MyRoutes() 的函数,其中包含许多路由,并在另一个文件夹中创建 handlerFunc。
func Test() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("test")
c.String(http.StatusOK, "test")
}
}
func MyRoutes() {
r := gin.Default()
r.GET("/test", Test())
r.Run()
}
或者你可以调用你的函数,因为中间件 gin 要求是你知道的 HandlerFunc 类型。
func main() {
// Creates a router without any middleware by default
r := gin.New()
r.Use(Test())
...
查看更多关于gin中间件的信息 https://github.com/gin-gonic/gin#using-middleware
我是这样解决的。在 gin.RouterGroup()
的单个实例。结果我有了这个漂亮干净的文件夹结构:
controllers/
user_controllers
book_controllers
routes/
user_routes
book_rontrollers
index
middlewares/
all
main.go
main.go
func startServer() {
app := gin.New()
router := app.Group("/api/v1")
routes.AddRoutes(router)
utils.ConnectDatabase()
app.Run(":5500")
}
routes/book_routes.go
package routes
func bookRoutes(superRoute *gin.RouterGroup) {
booksRouter := superRoute.Group("/books")
{
booksRouter.GET("/", controllers.BookControllers.GetBooks)
booksRouter.POST("/", controllers.BookControllers.CreateBook)
}
}
routes/user_routes.go
package routes
func userRoutes(superRoute *gin.RouterGroup) {
booksRouter := superRoute.Group("/users")
{
booksRouter.GET("/", controllers.UserControllers.GetUsers)
booksRouter.POST("/", controllers.UserControllers.CreateUser)
}
}
routes/index.go
func AddRoutes(superRoute *gin.RouterGroup) {
bookRoutes(superRoute)
userRoutes(superRoute)
}
感谢 Whosebug 社区