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.