El mejor framework de go para desarrolladores nodejs-express
Tags: go, gofiber, node, tutorial
Published: 2020-05-08 12:35:29


### Tabla de contenidos 
* [¿Por qué fiber?](#por-que-fiber)
* [Requisitos](#requisitos)
* [Primer ejemplo](#ejemplo)
* [Parámetros opcionales en las rutas](#parametros)
* [Como utilizar prefijos en nuestras rutas](#prefijos")
* [Sirviendo archivos estáticos](#estaticos)
* [Ruta para 404](#404)
* [Configuración para spa](#spa)
* [Utilizando multiples middlewares](#middlewares)
* [Performance y benchmark](#performance)
* [Conclusión](#conclusion)


 


 <a name="introduccion"></a>
 Actualmente no soy un experto ni mucho menos en este lenguaje pero he llegado a agarrarle cariño y quiero compartir con ustedes no un tutorial de go como muchos existentes, quiero compartir un framework que se ha convertido rápidamente en mi favorito (bueno digo esto pero realmente el otro con el que he trabajado es Beego así que no es que los conozca todos pero así funciona el amarillismo). Planeo hacer este articulo introductorio y próximamente un ejemplo funcional.
 <a name="por-que-fiber"></a>
#### Así que, ¿Por qué fiber y por qué es el mejor framework de go para desarrolladores familiarizados con el entorno nodejs-express?

Muy sencillo joven padawan, en sus propias palabras:

> Fiber es un framework web inspirado en Express desarollado sobre Fasthttp, el motor HTTP más rápido para Go. Diseñado para facilitar las cosas logrando un desarrollo rápido con cero asignación de memoria y rendimiento en mente.

Como pueden apreciar el equipo creador de este framework esta dedicado a que la experiencia sea lo mas similar posible a la que tenemos quienes trabajamos con express.

#### Requisitos  <a name="requisitos"></a>

Como se pueden imaginar el requisito primordial es tener instalado go
Como este articulo es dedicado a fiber no explicare como instalar el lenguaje, es primordial tener conocimientos básicos de go.

Creamos una carpeta para nuestro proyecto en el directorio de trabajo y accedemos a ella.
``` mkdir example && cd example ```

Luego creamos el archivo main.go

``` touch main.go ```

En este punto necesitaremos obtener el paquete de fiber para poder seguir con el ejemplo así que lo instalaremos con:

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

Abrimos el archivo con nuestro editor de texto.

``` nano main.go ```
####Manos a la obra  <a name="ejemplo"></a>

Ahora colocamos este código de ejemplo que nos ofrece la [Documentación oficial](https://docs.gofiber.io/)

```go
package main
import "github.com/gofiber/fiber"
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) {
c.Send("Hola, Mundo!")
})
app.Listen(3000)
}
```
Lo ejecutamos
``` go run main.go ```

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/l9h6qzcvfkdh2dzg9eja.png)

Wuolah! tenemos un servidor escuchando en el puerto 3000 y nuestra primera ruta.

Como podrán imaginarse si colocamos este ejemplo funcionara sin problemas

```go
app.Get("/:valor", func(c *fiber.Ctx) {
c.Send("Pedido Get con el valor: " + c.Params("valor"))
// => Pedido Get con el valor: hola mundo
})
```
También soporta parámetros opcionales en las rutas colocando ? al final del parámetro como hacemos en express.  <a name="parametros"></a>

```go
app.Get("ruta/:nombre?/:apellido?", func(c *fiber.Ctx) {
nombre := "Sin nombre"
apellido := "Sin apellido"
if c.Params("nombre") != "" {
nombre = c.Params("nombre")
// => Hola: michel Sin apellido
}
if c.Params("apellido") != "" {
apellido = c.Params("apellido")
// => Hola:  Sin nombre novellino
}
if c.Params("nombre") == "" && c.Params("apellido") == "" {
c.Send("¿Por qué no envía el nombre y apellido?")
}
c.Send("Hola: " + nombre + " " + apellido)
})
```

Podemos agrupar nuestras rutas con prefijos  <a name="prefijos"></a>

```go
g := app.Group("/users")
g.Get("/", GetAllHandler())
g.Get("/:id", GetHandler())
g.Post("/", PostHandler())
g.Put("/:id", PutHandler())
g.Delete("/:id", DeleteHandler())
```

¿Archivos estaticos? por supuesto, tan sencillo de declarar como esto.  <a name="estaticos"></a>

```go
app.Static("/static", "./public") 
 ```

¿Manejar 404 para rutas no existentes?  <a name="404"></a>

```go
app.Use(func(c *fiber.Ctx) {
c.SendStatus(404) // => 404 "Not Found"
c.Send("Not Found")
})
 ```

¿ Quieres servir una spa?  <a name="spa"></a>


```go
func main() {
app := fiber.New()
app.Static("/web", "dist")
app.Get("/web/*", func(ctx *fiber.Ctx) {
ctx.SendFile("dist/index.html")
})
// Start server on http://localhost:3000
log.Fatal(app.Listen(3000))
}
 ```

¿Puedo manejar multiples middlewares? claro que si.  <a name="middlewares"></a>
 

```go
app := fiber.New()
app.Get("/", one, two, three)
app.Listen(3000)
}
func one(c *fiber.Ctx) {
fmt.Println("ruta 1")
c.Next()
}
func two(c *fiber.Ctx) {
fmt.Println("ruta 2")
c.Next()
}
func three(c *fiber.Ctx) {
fmt.Println("ruta 3")
c.Send("Hello, World!")
}
```

¿Fiber tiene buen performance?  <a name="performance"></a>

Como ya se ha explicado fiber es un framework cuya intención principal es generar una curva de aprendizaje corta para desarolladores de express, esto no quiere decir que el tema del performance sea algo netamente secundario, todo lo contrario, el rendimiento frente a nodejs es abismal, como prueba les dejo el link directo al [benchmark](https://docs.gofiber.io/benchmarks).

 <a name="conclusion"></a>
En **conclusión** podemos decir que es quizá la mejor opción en el mercado para el guerrero experimentado del mundo javascript con express, para aquel que quiera trabajar con go y no sufrir la nostalgia de extrañar la forma de trabajar del framework de javascript, Como un comentario final para el lector Si recibo buen feedback de este articulo traeré una segunda parte con un ejemplo funcional de un crud con mysql utilizando gorm y las funcionalidades de Fiber, Déjenme saber que les parece el articulo y hasta la próxima.