go-gin: router как промежуточное ПО [дубликат]

Я разработчик nodejs, в настоящее время изучаю golang, чтобы расширить свои знания. В экспрессе мы можем использовать маршрутизатор в качестве промежуточного программного обеспечения.

Создание пользовательского маршрутизатора с его конкретным промежуточным программным обеспечением:

      // ** 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

Таким образом, каждый маршрут (например, «пользователи», «обзоры») может быть помещен в файл с его конкретными промежуточными программами и конечными точками.

Я пытаюсь достичь той же логики в джин-гонике / джин. Я пытался:

      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")
}

Я узнал что только может использоваться как промежуточное ПО. Мне нужно что-то вроде в джин. Любая помощь или предложения приветствуются

2 ответа

Вот как я это решил. Следуя ответу blackgreen, я создал супергруппу («/api/v1»), а затем добавил в нее дочерние группы («пользователи», «книги»). Мне удалось поместить дочерние группы в разные файлы и отправить им один экземпляр 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

Я думаю, вы можете создать функцию с именем 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, поскольку промежуточное программное обеспечение 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.

Другие вопросы по тегам