Skip to content

Latest commit

 

History

History
313 lines (233 loc) · 8.72 KB

whats_new.md

File metadata and controls

313 lines (233 loc) · 8.72 KB
id title sidebar_position toc_max_heading_level
whats_new
🆕 Whats New in v3
2
4

:::caution

Its a draft, not finished yet.

:::

🎉 Welcome to Fiber v3

We are excited to announce the release of Fiber v3! 🚀

In this guide, we'll walk you through the most important changes in Fiber v3 and show you how to migrate your existing Fiber v2 applications to Fiber v3.

Drop for old Go versions

Fiber v3 drops support for Go versions below 1.21. We recommend upgrading to Go 1.21 or higher to use Fiber v3.

🚀 App

:::caution DRAFT section :::

We have made several changes to the Fiber app, including:

  • Listen -> unified with config
  • app.Config properties moved to listen config
    • DisableStartupMessage
    • EnablePrefork -> previously Prefork
    • EnablePrintRoutes
    • ListenerNetwork -> previously Network

new methods

  • RegisterCustomBinder
  • RegisterCustomConstraint
  • NewCtxFunc

removed methods

  • Mount -> Use app.Use() instead
  • ListenTLS -> Use app.Listen() with tls.Config
  • ListenTLSWithCertificate -> Use app.Listen() with tls.Config
  • ListenMutualTLS -> Use app.Listen() with tls.Config
  • ListenMutualTLSWithCertificate -> Use app.Listen() with tls.Config

Methods changes

  • Test -> timeout changed to 1 second
  • Listen -> has a config parameter
  • Listener -> has a config parameter

CTX interface + customizable


🗺️ Router

We have slightly adapted our router interface

HTTP method registration

In v2 one handler was already mandatory when the route has been registered, but this was checked at runtime and was not correctly reflected in the signature, this has now been changed in v3 to make it more explicit.

-    Get(path string, handlers ...Handler) Router
+    Get(path string, handler Handler, middleware ...Handler) Router
-    Head(path string, handlers ...Handler) Router
+    Head(path string, handler Handler, middleware ...Handler) Router
-    Post(path string, handlers ...Handler) Router
+    Post(path string, handler Handler, middleware ...Handler) Router
-    Put(path string, handlers ...Handler) Router
+    Put(path string, handler Handler, middleware ...Handler) Router
-    Delete(path string, handlers ...Handler) Router
+    Delete(path string, handler Handler, middleware ...Handler) Router
-    Connect(path string, handlers ...Handler) Router
+    Connect(path string, handler Handler, middleware ...Handler) Router
-    Options(path string, handlers ...Handler) Router
+    Options(path string, handler Handler, middleware ...Handler) Router
-    Trace(path string, handlers ...Handler) Router
+    Trace(path string, handler Handler, middleware ...Handler) Router
-    Patch(path string, handlers ...Handler) Router
+    Patch(path string, handler Handler, middleware ...Handler) Router
-    All(path string, handlers ...Handler) Router
+    All(path string, handler Handler, middleware ...Handler) Router

Route chaining

The route method is now like ExpressJs which gives you the option of a different notation and allows you to concatenate the route declaration.

-    Route(prefix string, fn func(router Router), name ...string) Router
+    Route(path string) Register    
Example
app.Route("/api").Route("/user/:id?")
  .Get(func(c fiber.Ctx) error {
    // Get user
    return c.JSON(fiber.Map{"message": "Get user", "id": c.Params("id")})
  })
  .Post(func(c fiber.Ctx) error {
    // Create user
    return c.JSON(fiber.Map{"message": "User created"})
  })
  .Put(func(c fiber.Ctx) error {
    // Update user
    return c.JSON(fiber.Map{"message": "User updated", "id": c.Params("id")})
  })
  .Delete(func(c fiber.Ctx) error {
    // Delete user
    return c.JSON(fiber.Map{"message": "User deleted", "id": c.Params("id")})
  })
})

Here you can find more information.

Middleware registration

We have aligned our method for middlewares closer to express and now also support the Use of multiple prefixes.

Registering a subapp is now also possible via the Use method instead of the old v2 Mount method.

-    Use(args ...interface{}) Router
+    Use(args ...any) Router
Example
// register mulitple prefixes
app.Use(["/v1", "/v2"], func(c *fiber.Ctx) error {
  // Middleware for /v1 and /v2
  return c.Next() 
})

// define subapp
api := fiber.New()
api.Get("/user", func(c *fiber.Ctx) error {
  return c.SendString("User")
})
// register subapp
app.Use("/api", api)

To enable the routing changes above we had to slightly adjust the signature of the Add method.

-    Add(method, path string, handlers ...Handler) Router
+    Add(methods []string, path string, handler Handler, middleware ...Handler) Router

🧠 Context

:::caution DRAFT section :::

new methods

  • AutoFormat -> ExpressJs like
  • Host -> ExpressJs like
  • Port -> ExpressJs like
  • IsProxyTrusted
  • Reset
  • Schema -> ExpressJs like
  • SendStream -> ExpressJs like
  • SendString -> ExpressJs like
  • String -> ExpressJs like
  • ViewBind -> instead of Bind

removed methods

  • AllParams -> c.Bind().URL() ?
  • ParamsInt -> Params Generic
  • QueryBool -> Query Generic
  • QueryFloat -> Query Generic
  • QueryInt -> Query Generic
  • BodyParser -> c.Bind().Body()
  • CookieParser -> c.Bind().Cookie()
  • ParamsParser -> c.Bind().URL()
  • RedirectToRoute -> c.Redirect().Route()
  • RedirectBack -> c.Redirect().Back()
  • ReqHeaderParser -> c.Bind().Header()

changed methods

  • Bind -> for Binding instead of View, us c.ViewBind()
  • Format -> Param: body interface{} -> handlers ...ResFmt
  • Redirect -> c.Redirect().To()

🌎 Client package

:::caution DRAFT section :::

📎 Binding

:::caution DRAFT section :::

↪️ Redirect

:::caution DRAFT section :::

🧰 Generic functions

:::caution DRAFT section :::

Updates to CORS Middleware

We've made some changes to the CORS middleware to improve its functionality and flexibility. Here's what's new:

New Struct Fields

  • Config.AllowPrivateNetwork: This new field is a boolean that allows you to control whether private networks are allowed. This is related to the Private Network Access (PNA) specification from the Web Incubator Community Group (WICG). When set to true, the CORS middleware will allow CORS preflight requests from private networks and respond with the Access-Control-Allow-Private-Network: true header. This could be useful in development environments or specific use cases, but should be done with caution due to potential security risks.

Updated Struct Fields

We've updated several fields from a single string (containing comma-separated values) to slices, allowing for more explicit declaration of multiple values. Here are the updated fields:

  • Config.AllowOrigins: Now accepts a slice of strings, each representing an allowed origin.
  • Config.AllowMethods: Now accepts a slice of strings, each representing an allowed method.
  • Config.AllowHeaders: Now accepts a slice of strings, each representing an allowed header.
  • Config.ExposeHeaders: Now accepts a slice of strings, each representing an exposed header.

Session middleware

:::caution DRAFT section :::

Filesystem middleware

:::caution DRAFT section :::

Monitor middleware

:::caution DRAFT section :::

Monitor middleware is now in Contrib package.

📋 Migration guide

CORS Middleware

The CORS middleware has been updated to use slices instead of strings for the AllowOrigins, AllowMethods, AllowHeaders, and ExposeHeaders fields. Here's how you can update your code:

// Before
app.Use(cors.New(cors.Config{
  AllowOrigins: "https://example.com,https://example2.com",
  AllowMethods: strings.Join([]string{fiber.MethodGet, fiber.MethodPost}, ","),
  AllowHeaders: "Content-Type",
  ExposeHeaders: "Content-Length",
}))

// After
app.Use(cors.New(cors.Config{
  AllowOrigins: []string{"https://example.com", "https://example2.com"},
  AllowMethods: []string{fiber.MethodGet, fiber.MethodPost},
  AllowHeaders: []string{"Content-Type"},
  ExposeHeaders: []string{"Content-Length"},
}))

...