fiber について
fiberは、FiberでGoのWebアプリケーションを開発する人向けのクイックリファレンススキルです。アプリの設定、ルーティング、リクエスト処理、ミドルウェア、運用前の確認事項を扱います。
主な機能
- 01Fiberアプリの設定とルーティング
- 02パス、クエリ、リクエストボディの処理
- 03ミドルウェアの利用パターン
- 04ヘルスチェックとレディネスエンドポイント
- 05本番環境向けチェックリスト
活用シーン
- 01Fiber Webアプリの基本構成の作成
- 02ルート実装とリクエストデータの読み取り
- 03リカバリー、CORS、レート制限の設定
- 04サービス状態と本番設定の確認
MCP 対応
READMEでは、mcp__documentation__fetch_docsによるFiberドキュメント取得に言及しています。このスキルがMCPサーバーまたはクライアント機能を提供するとは説明されていません。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ claude-dev-suite/ claude-dev-suite --skill fiberインストール後、Claude Code で/fiberを入力して読み込まれたか確認します。
同梱ファイルadvanced.md
詳細
Fiber Core Knowledge
完全なリファレンス:go-playground/validator によるバリデーション、WebSocket のセットアップ、カスタムエラー処理、プリフォークモード、グレースフルシャットダウンについては、advanced.md を参照してください。
詳細な知識:包括的なドキュメントについては、technology:
fiberを指定してmcp__documentation__fetch_docsを使用してください。
基本セットアップ
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")
}
設定
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,
})
ルーティング
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)
コンテキスト - リクエストデータ
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)
})
ボディの解析
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)
})
ミドルウェア
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,
}))
ヘルスチェック
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"})
})
このスキルを使用しない場合
- Gin プロジェクト - Gin ではコンテキスト API が異なります
- Echo プロジェクト - Echo ではミドルウェアのパターンが異なります
- Chi プロジェクト - Chi は標準ライブラリと互換性があります
- 標準の net/http が必要な場合 - Fiber は net/http ではなく fasthttp を使用します
- gRPC サービス - Fiber は gRPC をサポートしていません
アンチパターン
| アンチパターン | 問題点 | 解決策 |
|---|---|---|
ミドルウェアで c.Next() を呼び出さない | ミドルウェアチェーンが中断されます | 処理を停止する場合を除き、必ず c.Next() を呼び出します |
c.Body() を複数回使用する | ボディは消費されます | まずボディを変数に保存します |
| エラー処理がない | エラーが通知されずに失敗します | BodyParser() の戻り値を確認します |
| Prefork を慎重に設定しない | 状態に問題が発生する可能性があります | 共有状態がない場合にのみ Prefork を使用します |
| レート制限がない | DDoS の脆弱性が生じます | limiter ミドルウェアを使用します |
トラブルシューティング(クイックガイド)
| 問題 | 診断 | 解決策 |
|---|---|---|
| ルートが見つからない | メソッドまたはパスが間違っています | 正確なルート登録を確認します |
| ボディの解析に失敗する | Content-Type が間違っています | Content-Type ヘッダーが正しいことを確認します |
| CORS エラー | 設定されていません | cors.New() ミドルウェアを使用します |
| ミドルウェアが実行されない | 順序が間違っています | ルートハンドラーより前に配置します |
| Prefork の問題 | 共有状態に関する問題です | Prefork では可変状態を共有しないようにします |
本番環境チェックリスト
- Recovery ミドルウェアが有効
- CORS が設定済み
- レート制限が有効
- リクエストボディのサイズ制限が設定済み
- タイムアウトが設定済み
- 構造化ログ
- ヘルス/レディネスエンドポイント
- グレースフルシャットダウン
- 入力バリデーション
リファレンスドキュメント
コメント
Markdown 対応