0

我是一名 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

这样,每条路由(例如“用户”、“评论”)都可以放置在具有特定中间件和端点的文件中。

我试图在 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杜松子酒的东西。欢迎任何帮助或建议

4

2 回答 2

0

这是我解决它的方法。按照blackgreen 的回答,我创建了一个超级组(“/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")
}

路线/book_routes.go

package routes

func bookRoutes(superRoute *gin.RouterGroup) {
    booksRouter := superRoute.Group("/books")
    {
        booksRouter.GET("/", controllers.BookControllers.GetBooks)

        booksRouter.POST("/", controllers.BookControllers.CreateBook)
    }
}

路线/user_routes.go

package routes

func userRoutes(superRoute *gin.RouterGroup) {
    booksRouter := superRoute.Group("/users")
    {
        booksRouter.GET("/", controllers.UserControllers.GetUsers)

        booksRouter.POST("/", controllers.UserControllers.CreateUser)
    }
}

路线/index.go

func AddRoutes(superRoute *gin.RouterGroup) {
    bookRoutes(superRoute)
    userRoutes(superRoute)
}

感谢 stackoverflow 社区

于 2022-01-05T10:06:54.503 回答
0

我认为您可以创建一个名为 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()
}

或者您可以将您的 func 称为中间件杜松子酒要求是您所知道的 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

于 2022-01-05T07:25:12.807 回答