Go Fiber 소개

18879 단어 nodego

고섬유란?



FiberExpress에서 크게 영감을 받은 웹 프레임워크로 노드 개발자가 작업하기에 완벽합니다.

그것은 Fasthttp 엔진 위에 구축되었으며 여기에 일부 benchmarks가 있습니다. 또한 메모리 할당 오버헤드가 상당히 낮습니다. 예를 들어 이 기사를 작성하는 동안 메모리만 ~16mb 차지했는데 정말 놀랍습니다!

이 기사에서는 Fiber 프레임워크의 느낌을 얻기 위해 매우 간단한 모의 API 경로를 구현해 보겠습니다.

기사의 코드는 여기repository에서 사용할 수 있습니다.



시작하기



go 문서에서 바이너리를 설치하여 시스템에 직접 go를 설치할 수 있습니다https://golang.org/doc/install.



(선택 과목)

개인적으로 나는 docker를 사용하는 것을 좋아하므로 시스템에 아무것도 설치할 필요가 없습니다.
golang 도커 이미지를 가져오겠습니다.

docker pull golang


프로젝트 디렉터리 만들기

mkdir go-mock-api
cd go-mock-api


이제 포트4000를 바인딩하고 현재 디렉터리(go 프로젝트 디렉터리)를 볼륨으로 마운트하고 golang 이미지를 실행합니다.

docker run -itd -p 4000:4000 --name golang -v "$(pwd):/app" golang


실행 중인 golang 컨테이너를 실행하고 연결해 보겠습니다.

docker exec -it -w /app golang bash


이것은 우리를 golang 도커 이미지로 떨어뜨릴 것입니다. 이제 go 버전을 확인하고 시작하겠습니다.

go version


참고: docker를 사용하는 경우 아래의 모든 단계는 golang 컨테이너 내에서 실행됩니다.

설치


api 모듈을 초기화하자

go mod init api


광섬유 설치

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


리포지토리의 readme에 표시된 대로 포트api.go에서 샘플 Hello World 서버로 4000를 생성해 보겠습니다.

package main

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

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

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

    app.Listen(":4000")
}


개발



Reflex은 개발에 유용한 Go 앱의 실시간 재로드를 지원합니다. 이것은 nodemon 과 매우 유사하며, 또는 단순히 go run 명령을 사용하여 프로그램을 실행할 수 있습니다.

go get github.com/cespare/reflex


시작하자!

reflex -g '*.go' go run api.go --start-service



Starting service...

 ┌───────────────────────────────────────────────────┐ 
 │                   Fiber v2.13.0                   │ 
 │               http://127.0.0.1:4000               │ 
 │       (bound on host 0.0.0.0 and port 4000)       │ 
 │                                                   │ 
 │ Handlers ............. 2  Processes ........... 1 │ 
 │ Prefork ....... Disabled  PID .............. 3315 │ 
 └───────────────────────────────────────────────────┘ 


참고: PATH.bashrc 또는 .zshrc 파일에서 export PATH=$PATH:$HOME/go/bin/로 내보냈는지 확인하십시오.

이제 코드가 실행되는 것을 볼 수 있어야 하며 변경 사항이 있을 때 go 프로그램을 다시 실행할 필요 없이 자동으로 다시 로드되어야 합니다!

GET 경로 생성



섬유를 수입하자

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


기본 기능에 경로 추가user
app.Get("/user", getUserHandler)


요청을 처리할 getUserHandler를 추가해 보겠습니다. 여기서는 모의 사용자를 반환합니다.

type User struct {
    Name    string `json:"name"`
    Twitter string `json:"twitter"`
}

func getUserHandler(ctx *fiber.Ctx) error {
    user := User{
        Name:    "Karan",
        Twitter: "karan_6864",
    }

    return ctx.Status(fiber.StatusOK).JSON(user)
}


POST 경로 생성



마찬가지로 기본 기능에 post 경로를 추가해 보겠습니다.

    app.Post("/user/create", createUserHandler)


요청을 처리할 createUserHandler를 추가해 보겠습니다. 여기서는 단순히 본문을 구문 분석하고 응답으로 다시 보냅니다.

func createUserHandler(ctx *fiber.Ctx) error {
    body := new(User)
    err := ctx.BodyParser(body)

    if err != nil {
        ctx.Status(fiber.StatusBadRequest)
        return err
    }

    user := User{
        Name:    body.Name,
        Twitter: body.Twitter,
    }

    return ctx.Status(fiber.StatusOK).JSON(user)
}


미들웨어



파이버와 함께 제공되는 로깅 미들웨어를 추가해 보겠습니다.

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


이 미들웨어를 main 함수에 추가

app.Use(logger.New())


이렇게 하면 아래와 같이 몇 가지 로그가 표시됩니다.

12:04:01 | 200 |     1ms |      172.17.0.1 | GET     | /user           
12:04:27 | 200 |      0s |      172.17.0.1 | POST    | /user/create   


맞춤형 미들웨어도 정의할 수 있습니다.

    app.Use(func(ctx *fiber.Ctx) error {
        fmt.Println("Sample middleware")
        return ctx.Next()
    })


라우터


Group 기능을 사용하여 경로를 구성할 수 있습니다. Express에서 routing하는 것과 매우 유사합니다.

    userApi := app.Group("/user")

    userApi.Get("/", getUserHander)

    userApi.Post("/create", createUserHandler)


정적 파일 제공


public 폴더를 서버에 저장하려고 한다고 가정하면 아래와 같이 Static 기능을 간단히 사용할 수 있습니다.

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


그것을 밖으로 시도하자!



최종 결과입니다api.go.

package main

import (
    "fmt"

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

type User struct {
    Name    string `json:"name"`
    Twitter string `json:"twitter"`
}

func getUserHander(ctx *fiber.Ctx) error {
    user := User{
        Name:    "Karan",
        Twitter: "karan_6864",
    }

    return ctx.Status(fiber.StatusOK).JSON(user)
}

func createUserHandler(ctx *fiber.Ctx) error {
    body := new(User)
    err := ctx.BodyParser(body)

    if err != nil {
        fmt.Println(err)
        ctx.Status(fiber.StatusBadRequest)
        return err
    }

    user := User{
        Name:    body.Name,
        Twitter: body.Twitter,
    }

    return ctx.Status(fiber.StatusOK).JSON(user)
}

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

    app.Use(logger.New())

    userApi := app.Group("/user")

    userApi.Get("/", getUserHander)

    userApi.Post("/create", createUserHandler)

    app.Listen(":4000")
}


모의 엔드포인트를 테스트하기 위해 Insomnia을 사용하고 있습니다.

사용자 가져오기



사용자 만들기



문제가 발생하면 언제든지 연락해 주세요.

피드백은 언제나 환영합니다, 즐겁게 보내세요!

좋은 웹페이지 즐겨찾기