返回 Skill 列表
extension
分类: 开发与工程无需 API Key

fiber

受到Express启发的Fiber Go Web框架。涵盖了路由、中间件、上下文、WebSocket和预派生等功能。适用于类似Express的Go开发。使用场景:用户提到“fiber”、“gofiber”、“express-like go”、“fasthttp go”,或询问关于“fiber中间件”、“fiber上下文”、“fiber预派生”、“fiber WebSocket”、“go express”、“快速Go框架”。不用于:Gin项目-改用`gin`,Echo项目-改用`echo`,Chi项目-改用`chi`,需要标准net/http兼容性的项目

person作者: jakexiaohubgithub

Fiber Core Knowledge

Full Reference: See advanced.md for validation with go-playground/validator, WebSocket setup, custom error handling, prefork mode, and graceful shutdown.

Deep Knowledge: Use mcp__documentation__fetch_docs with technology: fiber for comprehensive documentation.

Basic Setup

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(":8080")
}

Configuration

app := fiber.New(fiber.Config{
    Prefork:       true,               // Multiple processes
    StrictRouting: true,               // /foo != /foo/
    CaseSensitive: true,               // /Foo != /foo
    BodyLimit:     4 * 1024 * 1024,    // 4MB
    ReadTimeout:   10 * time.Second,
    WriteTimeout:  10 * time.Second,
})

Routing

app.Get("/users", listUsers)
app.Get("/users/:id", getUser)
app.Post("/users", createUser)
app.Put("/users/:id", updateUser)
app.Delete("/users/:id", deleteUser)

// Path parameters
app.Get("/users/:id", func(c *fiber.Ctx) error {
    id := c.Params("id")
    return c.JSON(fiber.Map{"id": id})
})

// Optional parameter
app.Get("/users/:name?", func(c *fiber.Ctx) error {
    name := c.Params("name", "anonymous")
    return c.JSON(fiber.Map{"name": name})
})

// Route groups
api := app.Group("/api")
v1 := api.Group("/v1")
v1.Get("/users", listUsersV1)

Context - Request Data

app.Post("/users", func(c *fiber.Ctx) error {
    // Path params
    id := c.Params("id")
    idInt, _ := c.ParamsInt("id")

    // Query params
    page := c.Query("page", "1")
    pageInt := c.QueryInt("page", 1)

    // Headers
    auth := c.Get("Authorization")

    // Cookies
    session := c.Cookies("session_id")

    return c.SendStatus(fiber.StatusOK)
})

Body Parsing

type CreateUserRequest struct {
    Name  string `json:"name"`
    Email string `json:"email"`
}

app.Post("/users", func(c *fiber.Ctx) error {
    var req CreateUserRequest
    if err := c.BodyParser(&req); err != nil {
        return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
            "error": err.Error(),
        })
    }
    return c.Status(fiber.StatusCreated).JSON(req)
})

Middleware

import (
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/gofiber/fiber/v2/middleware/recover"
    "github.com/gofiber/fiber/v2/middleware/cors"
    "github.com/gofiber/fiber/v2/middleware/limiter"
)

app.Use(recover.New())
app.Use(logger.New())

app.Use(cors.New(cors.Config{
    AllowOrigins: "https://example.com",
    AllowMethods: "GET,POST,PUT,DELETE",
}))

app.Use(limiter.New(limiter.Config{
    Max:        100,
    Expiration: 1 * time.Minute,
}))

Health Checks

app.Get("/health", func(c *fiber.Ctx) error {
    return c.JSON(fiber.Map{"status": "healthy"})
})

app.Get("/ready", func(c *fiber.Ctx) error {
    if err := db.Ping(); err != nil {
        return c.Status(fiber.StatusServiceUnavailable).JSON(fiber.Map{
            "status": "not ready",
        })
    }
    return c.JSON(fiber.Map{"status": "ready"})
})

When NOT to Use This Skill

  • Gin projects - Gin has different context API
  • Echo projects - Echo has different middleware patterns
  • Chi projects - Chi is stdlib-compatible
  • Standard net/http required - Fiber uses fasthttp, not net/http
  • gRPC services - Fiber doesn't support gRPC

Anti-Patterns

| Anti-Pattern | Why It's Bad | Solution | |--------------|--------------|----------| | Not calling c.Next() in middleware | Breaks middleware chain | Always call c.Next() unless stopping | | Using c.Body() multiple times | Body is consumed | Store body in variable first | | Missing error handling | Silent failures | Check BodyParser() return value | | Not setting Prefork carefully | May cause issues with state | Only use Prefork without shared state | | No rate limiting | DDoS vulnerability | Use limiter middleware |

Quick Troubleshooting

| Problem | Diagnosis | Fix | |---------|-----------|-----| | Route not found | Wrong method or path | Check exact route registration | | Body parsing fails | Wrong content-type | Ensure Content-Type header is correct | | CORS errors | Not configured | Use cors.New() middleware | | Middleware not executing | Wrong order | Place before route handlers | | Prefork issues | Shared state problems | Avoid shared mutable state with Prefork |

Production Checklist

  • [ ] Recovery middleware enabled
  • [ ] CORS configured
  • [ ] Rate limiting enabled
  • [ ] Request body size limit set
  • [ ] Timeouts configured
  • [ ] Structured logging
  • [ ] Health/readiness endpoints
  • [ ] Graceful shutdown
  • [ ] Input validation

Reference Documentation