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 社区