Skip to content
Permalink
master
Switch branches/tags
Go to file
 
 
Cannot retrieve contributors at this time

Fiber

Fiber是移植NodeJS的Express框架改以Go語言編寫。本套件基於Fasthttp,Fasthttp有不分配記憶體空間Request Pool的特性,在網路效能方面有著顯著的效能。

⚡️ 快速入門

package main

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

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

    app.Get("/", func(c *fiber.Ctx) error {
        return c.SendString("Hello, World 👋!")
    })

    app.Listen(":3000")
}

🤖 效能

本測試使用TechEmpowerGo Web 框架效能測試。如果要看全部的執行結果,請到Wiki

⚙️ 安裝

確保已安裝 Go 版本 1.14 或以上 (下載)。

建立文件夾並在文件夾內執行 go mod init github.com/your/repo (了解更多) 指令建立專案,然後使用 go get 指令下載 fiber :

go get -u github.com/gofiber/fiber/v2

🎯 功能

💡 理念

不少Node.js的工程師跳到Go必須學習一些知識,因此做了一個跟 Express 一樣的 Fiber 省這些麻煩。設計還是照原本的極簡主義還有遵循UNIX 慣例,因此新手們可以無痛迅速進入 Go 的世界。

Fiber 受到 網路上最流行的 Web 框架 ExpressJS啟發,結合 Express 的易用性和 Go 的高效能。若你之前用過 Node.js 寫 Web 應用(使用 ExpressJS/Koa 或類似工具),那你已經上手了。

有什麼問題請發issues或加入 Discord channel討論,我們想要創造快速彈性友善的社群給任何人使用!就像 Express 那樣。

限制

  • 由於 Fiber 使用了 unsafe,該庫可能並不總是與最新的 Go 版本兼容。 Fiber 2.29.0 已經用 Go 版本 1.14 到 1.19 進行了測試。
  • Fiber 與 net/http 接口不兼容。 這意味著您將無法使用 gqlgen、go-swagger 或任何其他屬於 net/http 生態系統的項目。

👀 範例

以下是一些常見範例。

更多程式碼在範例專案中或直接看API 文件

📖 Basic Routing

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

    // GET /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    })

    // GET /flights/LAX-SFO
    app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
        return c.SendString(msg) // => 💸 From: LAX, To: SFO
    })

    // GET /dictionary.txt
    app.Get("/:file.:ext", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
        return c.SendString(msg) // => 📃 dictionary.txt
    })

    // GET /john/75
    app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
        return c.SendString(msg) // => 👴 john is 75 years old
    })

    // GET /john
    app.Get("/:name", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
        return c.SendString(msg) // => Hello john 👋!
    })

    log.Fatal(app.Listen(":3000"))
}

📖 路線命名

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

    // GET /api/register
    app.Get("/api/*", func(c *fiber.Ctx) error {
        msg := fmt.Sprintf("✋ %s", c.Params("*"))
        return c.SendString(msg) // => ✋ register
    }).Name("api")

    data, _ := json.MarshalIndent(app.GetRoute("api"), "", "  ")
    fmt.Print(string(data))
    // Prints:
    // {
    //    "method": "GET",
    //    "name": "api",
    //    "path": "/api/*",
    //    "params": [
    //      "*1"
    //    ]
    // }


    log.Fatal(app.Listen(":3000"))
}

📖 提供靜態文件

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

    app.Static("/", "./public")
    // => http://localhost:3000/js/script.js
    // => http://localhost:3000/css/style.css

    app.Static("/prefix", "./public")
    // => http://localhost:3000/prefix/js/script.js
    // => http://localhost:3000/prefix/css/style.css

    app.Static("*", "./public/index.html")
    // => http://localhost:3000/any/path/shows/index/html

    log.Fatal(app.Listen(":3000"))
}

📖 Middleware & Next

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

	// Match any route
	app.Use(func(c *fiber.Ctx) error {
		fmt.Println("🥇 First handler")
		return c.Next()
	})

	// Match all routes starting with /api
	app.Use("/api", func(c *fiber.Ctx) error {
		fmt.Println("🥈 Second handler")
		return c.Next()
	})

	// GET /api/register
	app.Get("/api/list", func(c *fiber.Ctx) error {
		fmt.Println("🥉 Last handler")
		return c.SendString("Hello, World 👋!")
	})

	log.Fatal(app.Listen(":3000"))
}
📚 顯示更多範例

界面引擎

📖 設定 📖 引擎 📖 渲染

當不指定樣板引擎時 Fiber 預設用html/template

如果你想要執行部份或用別的樣板引擎amberhandlebarsmustachepug之類…請參考符合多樣板引擎的樣板套件。

package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/template/pug"
)

func main() {
    // You can setup Views engine before initiation app:
    app := fiber.New(fiber.Config{
        Views: pug.New("./views", ".pug"),
    })

    // And now, you can call template `./views/home.pug` like this:
    app.Get("/", func(c *fiber.Ctx) error {
        return c.Render("home", fiber.Map{
            "title": "Homepage",
            "year":  1999,
        })
    })

    log.Fatal(app.Listen(":3000"))
}

鏈式路線分組

📖 Group

func middleware(c *fiber.Ctx) error {
    fmt.Println("Don't mind me!")
    return c.Next()
}

func handler(c *fiber.Ctx) error {
    return c.SendString(c.Path())
}

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

    // Root API route
    api := app.Group("/api", middleware) // /api

    // API v1 routes
    v1 := api.Group("/v1", middleware) // /api/v1
    v1.Get("/list", handler)           // /api/v1/list
    v1.Get("/user", handler)           // /api/v1/user

    // API v2 routes
    v2 := api.Group("/v2", middleware) // /api/v2
    v2.Get("/list", handler)           // /api/v2/list
    v2.Get("/user", handler)           // /api/v2/user

    // ...
}

中介器 logger

📖 Logger

package main

import (
    "log"

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

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

    app.Use(logger.New())

    // ...

    log.Fatal(app.Listen(":3000"))
}

跨網域資源共享 (CORS)

📖 CORS

import (
    "log"

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

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

    app.Use(cors.New())

    // ...

    log.Fatal(app.Listen(":3000"))
}

Origin header 中放網域來檢查 CORS:

curl -H "Origin: http://example.com" --verbose http://localhost:3000

客制 404 回應

📖 HTTP Methods

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

    app.Static("/", "./public")

    app.Get("/demo", func(c *fiber.Ctx) error {
        return c.SendString("This is a demo!")
    })

    app.Post("/register", func(c *fiber.Ctx) error {
        return c.SendString("Welcome!")
    })

    // Last middleware to match anything
    app.Use(func(c *fiber.Ctx) error {
        return c.SendStatus(404)
        // => 404 "Not Found"
    })

    log.Fatal(app.Listen(":3000"))
}

JSON 回應

📖 JSON

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

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

    app.Get("/user", func(c *fiber.Ctx) error {
        return c.JSON(&User{"John", 20})
        // => {"name":"John", "age":20}
    })

    app.Get("/json", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{
            "success": true,
            "message": "Hi John!",
        })
        // => {"success":true, "message":"Hi John!"}
    })

    log.Fatal(app.Listen(":3000"))
}

WebSocket 升級

📖 Websocket

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/websocket"
)

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

  app.Get("/ws", websocket.New(func(c *websocket.Conn) {
    for {
      mt, msg, err := c.ReadMessage()
      if err != nil {
        log.Println("read:", err)
        break
      }
      log.Printf("recv: %s", msg)
      err = c.WriteMessage(mt, msg)
      if err != nil {
        log.Println("write:", err)
        break
      }
    }
  }))

  log.Fatal(app.Listen(":3000"))
  // ws://localhost:3000/ws
}

Server-Sent Events

📖 More Info

import (
    "github.com/gofiber/fiber/v2"
    "github.com/valyala/fasthttp"
)

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

  app.Get("/sse", func(c *fiber.Ctx) error {
    c.Set("Content-Type", "text/event-stream")
    c.Set("Cache-Control", "no-cache")
    c.Set("Connection", "keep-alive")
    c.Set("Transfer-Encoding", "chunked")

    c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
      fmt.Println("WRITER")
      var i int
      
      for {
        i++
        msg := fmt.Sprintf("%d - the time is %v", i, time.Now())
        fmt.Fprintf(w, "data: Message: %s\n\n", msg)
        fmt.Println(msg)

        w.Flush()
        time.Sleep(5 * time.Second)
      }
    }))

    return nil
  })

  log.Fatal(app.Listen(":3000"))
}

Recover 中介器

📖 Recover

import (
	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/recover"
)

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

	app.Use(recover.New())

	app.Get("/", func(c *fiber.Ctx) error {
		panic("normally this would crash your app")
	})

	log.Fatal(app.Listen(":3000"))
}

🧬 内部中間件

以下為包含在Fiber框架中的中間件列表.

中間件 描述
basicauth 基本身份驗證中間件提供 HTTP 基本身份驗證。 它為有效憑據調用下一個處理程序,並為丟失或無效憑據調用 401 Unauthorized。
cache 攔截和緩存響應
compress CFiber的壓縮中間件,默認支持deflategzipbrotli
cors 使用各種選項啟用跨域資源共享 (CORS)。
csrf 防止 CSRF 漏洞利用。
encryptcookie Encrypt middleware which encrypts cookie values.
envvar Expose environment variables with providing an optional config.
etag ETag middleware that lets caches be more efficient and save bandwidth, as a web server does not need to resend a full response if the content has not changed.
expvar Expvar middleware that serves via its HTTP server runtime exposed variants in the JSON format.
favicon 如果提供了文件路徑,則忽略日誌中的網站圖標或從內存中提供服務。
filesystem 用於 Fiber 的 FileSystem 中間件,特別感謝 Alireza Salary
limiter Fiber 的限速中間件。 用於限制對公共 API 和/或端點的重複請求,例如密碼重置。
logger HTTP 請求/響應 logger.
monitor Monitor middleware that reports server metrics, inspired by express-status-monitor
pprof 特別感謝 Matthew Lee (@mthli)
proxy 允許您將請求代理到多個服務器
recover 恢復中間件從堆棧鏈中任何地方的恐慌中恢復,並將控制權交給集中式 ErrorHandler.
requestid 為每個請求添加一個 requestid。
session Session middleware. NOTE: This middleware uses our Storage package.
skip Skip middleware that skips a wrapped handler is a predicate is true.
timeout 添加請求的最大時間,如果超過則轉發給 ErrorHandler。

🧬 外部中間件

由 [Fiber 團隊] (https://github.com/orgs/gofiber/people) 維護的外部託管中間件模塊列表。

Middleware Description
adaptor net/http 處理程序與 Fiber 請求處理程序之間的轉換器,特別感謝 @arsmn!
helmet 通過設置各種 HTTP 標頭來幫助保護您的應用程序。
jwt JWT 返回一個 JSON Web Token (JWT) 身份驗證中間件。
keyauth Key auth 中間件提供基於密鑰的身份驗證。
redirect Redirect middleware
rewrite 重寫中間件根據提供的規則重寫 URL 路徑。 它有助於向後兼容或只是創建更清晰和更具描述性的鏈接。
storage Premade storage drivers that implement the Storage interface, designed to be used with various Fiber middlewares.
template 該軟件包包含 8 個模板引擎,可用於 Fiber v1.10.x Go 版本 1.13 或更高版本。
websocket 基於 Fasthttp WebSocket for Fiber,支持 Locals!

🕶️ Awesome List

For more articles, middlewares, examples or tools check our awesome list.

👍 貢獻

如果您要說聲謝謝或支援Fiber的積極發展:

  1. 點擊GitHub Star關注本專案。
  2. Twitter
  3. MediumDev.to、部落格上發表意見或教學。
  4. 贊助我們一杯咖啡

支持者

Fiber 是一個以贊助維生的開源專案,像是: 網域、gitbook、netlify、serverless 伺服器。如果你想贊助也可以 買杯咖啡

User Donation
@destari x 10
@dembygenesis x 5
@thomasvvugt x 5
@hendratommy x 5
@ekaputra07 x 5
@jorgefuertes x 5
@candidosales x 5
@l0nax x 3
@bihe x 3
@justdave x 3
@koddr x 1
@lapolinar x 1
@diegowifi x 1
@ssimk0 x 1
@raymayemir x 1
@melkorm x 1
@marvinjwendt x 1
@toishy x 1

‎‍💻 貢獻者

Code Contributors

⭐️ Stargazers

Stargazers over time

⚠️ 授權

版權所有 (c) 2019 年至今 Fenny貢獻者Fiber 是根據 [MIT 許可證] (https://github.com/gofiber/fiber/blob/master/LICENSE) 許可的免費開源軟件。 官方徽標由 Vic Shóstak 創建並在 Creative Commons 許可下分發 (CC BY- SA 4.0 國際)。

Third-party library licenses