一架梯子,一头程序猿,仰望星空!
Go Fiber教程 > 内容正文

Go Fiber Hooks


Fiber Hooks (钩子)

通过Fiber框架提供的钩子,我们拦截框架运行的行为,在一些关键环节自定义逻辑。

从Fiber v2.30.0开始,您可以在运行一些方法时执行自定义用户函数。以下是这些钩子的列表:

  • OnRoute(路由钩子)
  • OnName(命名钩子)
  • OnGroup(分组钩子)
  • OnGroupName(分组命名钩子)
  • OnListen(监听钩子)
  • OnFork(分叉钩子)
  • OnShutdown(关闭钩子)
  • OnMount(挂载钩子)

常量

// Handlers define a function to create hooks for Fiber.
type OnRouteHandler = func(Route) error
type OnNameHandler = OnRouteHandler
type OnGroupHandler = func(Group) error
type OnGroupNameHandler = OnGroupHandler
type OnListenHandler = func(ListenData) error
type OnForkHandler = func(int) error
type OnShutdownHandler = func() error
type OnMountHandler = func(*App) error

OnRoute(路由钩子)

OnRoute(路由钩子)是一个在每个路由注册时执行用户函数的钩子。您还可以通过 route 参数获取路由属性。

签名

func (app *App) OnRoute(handler ...OnRouteHandler)

OnName(命名钩子)

OnName(命名钩子)是一个在每个路由命名时执行用户函数的钩子。您还可以通过 route 参数获取路由属性。

注意: OnName只适用于命名路由,而不适用于分组。

签名

func (app *App) OnName(handler ...OnNameHandler)
  • OnName示例
package main

import (
    "fmt"

    "github.com/gofiber/fiber/v2"
)

func main() {
    app := fiber.New()

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString(c.Route().Name)
    }).Name("index")

    app.Hooks().OnName(func(r fiber.Route) error {
        fmt.Print("Name: " + r.Name + ", ")

        return nil
    })

    app.Hooks().OnName(func(r fiber.Route) error {
        fmt.Print("Method: " + r.Method + "\n")

        return nil
    })

    app.Get("/add/user", func(c *fiber.Ctx) error {
        return c.SendString(c.Route().Name)
    }).Name("addUser")

    app.Delete("/destroy/user", func(c *fiber.Ctx) error {
        return c.SendString(c.Route().Name)
    }).Name("destroyUser")

    app.Listen(":5000")
}

// 结果:
// Name: addUser, Method: GET
// Name: destroyUser, Method: DELETE

OnGroup(分组钩子)

OnGroup(分组钩子)是一个在每个分组注册时执行用户函数的钩子。您还可以通过 group 参数获取分组属性。

签名

func (app *App) OnGroup(handler ...OnGroupHandler)

OnGroupName(分组命名钩子)

OnGroupName(分组命名钩子)是一个在每个分组命名时执行用户函数的钩子。您还可以通过 group 参数获取分组属性。

注意: OnGroupName只适用于命名分组,而不适用于路由。

签名

func (app *App) OnGroupName(handler ...OnGroupNameHandler)

OnListen(监听钩子)

OnListen(监听钩子)是在执行Listen、ListenTLS、Listener操作时执行用户函数的钩子。

签名

func (app *App) OnListen(handler ...OnListenHandler)
  • OnListen示例
app := fiber.New(fiber.Config{
  DisableStartupMessage: true,
})

app.Hooks().OnListen(func(listenData fiber.ListenData) error {
  if fiber.IsChild() {
      return nil
  }
  scheme := "http"
  if listenData.TLS {
    scheme = "https"
  }
  log.Println(scheme + "://" + listenData.Host + ":" + listenData.Port)
  return nil
})

app.Listen(":5000")

OnFork(分叉钩子)

OnFork(分叉钩子)是在执行Fork操作时执行用户函数的钩子。

签名

func (app *App) OnFork(handler ...OnForkHandler)

OnShutdown(关闭钩子)

OnShutdown(关闭钩子)是在执行Shutdown操作后执行用户函数的钩子。

签名

func (app *App) OnShutdown(handler ...OnShutdownHandler)

OnMount

OnMount是一个在挂载过程后执行用户函数的钩子。当子应用程序挂载到父应用程序时,触发挂载事件。父应用程序作为参数传递。它适用于应用程序和组的挂载。

签名

func (h *Hooks) OnMount(handler ...OnMountHandler)
  • OnMount示例
package main

import (
    "fmt"

    "github.com/gofiber/fiber/v2"
)

func main() {
    app := New()
    app.Get("/", testSimpleHandler).Name("x")

    subApp := New()
    subApp.Get("/test", testSimpleHandler)

    subApp.Hooks().OnMount(func(parent *fiber.App) error {
        fmt.Print("父应用程序的挂载路径: "+parent.MountPath())
        // ...

        return nil
    })

    app.Mount("/sub", subApp)
}

// 结果:
// 父应用程序的挂载路径:

注意:OnName/OnRoute/OnGroup/OnGroupName钩子是挂载敏感的。如果您在子应用程序上使用这些路由并挂载它,路由和组的路径将以挂载前缀开头。