項目名稱你可以取一個你喜歡的名字,比如 golang-api,然后 Next:

接著直接點擊 Create Project 即可:

然后,點擊 Build a Database

選擇免費的 Shared

點擊 Create Cluster 創建集群,需要等一些時間。(其他用默認即可)

接著需要創建能夠訪問該數據庫的用戶。點擊 Create User,如果需要保證安全性,可以限制 IP。然后點擊 Finish and Close 即可。

你也可以不限制 IP,畢竟我們只是練習、測試項目。(如果你下面運行程序,發現連不上 MongoDB,就考慮把 IP 限制直接去掉)

保存后,可以看到 Database Deployments 界面:

初始化 Go 項目

GitHub 創建項目:fibermongo,clone 到本地,然后初始化:

$ go mod init github.com/programmerug/fibermongo
go: creating new go.mod: module github.com/programmerug/fibermongo

安裝以下兩個依賴:

$ go get -v github.com/gofiber/fiber/v2
$ go get -v go.mongodb.org/mongo-driver/mongo

接著在目錄下創建 main.go,輸入如下內容:

package main

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

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

 app.Get("/", func(c *fiber.Ctx) error {
  return c.JSON(&fiber.Map{"welcome": "Hello from Fiber + MongoDB"})
 })

 app.Listen(":2022")
}

啟動 go run main.go,然后通過 curlie[1] 測試(這是 Go 實現的類似 curl 工具,易用性類似 httpie):

$ curlie localhost:2022
HTTP/1.1 200 OK
Date: Mon, 07 Feb 2022 09:05:48 GMT
Content-Type: application/json
Content-Length: 40

{
    "welcome": "Hello from Fiber + MongoDB"
}

2、目錄結構

創建如下目錄,注意其中的注釋:

.
├── config 用于項目配置文件
├── controller 用于應用程序邏輯
├── go.mod
├── go.sum  
├── main.go
├── model  用于數據和數據庫邏輯
├── response  用于描述我們希望 API 給出的響應的文件
└── route  用于 URL 模式和處理程序信息

3、配置連接到 MongoDB

為了讓我們的程序連接到數據庫 MongoDB,跟 MySQL 等類似,需要連接字符串。

在上面 MongoDB 的 Database Deployments 頁面,點擊 Connect 按鈕:

接著點擊 Connect your application,然后驅動選擇 Go,及其版本。

然后復制:

設置環境變量

在項目根目錄創建 .env 文件,增加 MONGOURI:

MONGOURI=mongodb+srv://<user>:<password>@cluster0.k0oen.mongodb.net/myFirstDatabase?retryWrites=true&w=majority

注意替換其中的 user 和 password 為你開頭設置的。

接著需要寫代碼讀取環境變量。因為環境變量通過 key=value 的簡單形式保存在文件,因此我們使用一個對應的第三方庫:github.com/joho/godotenv。

在 config 目錄中增加 env.go 文件,輸入如下內容:

package config

import (
 "log"
 "os"

 "github.com/joho/godotenv"
)

func EnvMongoURI() string {
 err := godotenv.Load()
 if err != nil {
  log.Fatal("Error loading .env file")
 }

 return os.Getenv("MONGOURI")
}

然后執行 go mod tidy,更新依賴。(這個命令可以多次執行)

連接到 MongoDB

接著在 config 目錄下創建 setup.go 文件,增加如下內容:

package config

import (
 "context"
 "fmt"
 "log"
 "time"

 "go.mongodb.org/mongo-driver/mongo"
 "go.mongodb.org/mongo-driver/mongo/options"
)

func ConnectDB() *mongo.Client {
 client, err := mongo.NewClient(options.Client().ApplyURI(EnvMongoURI()))
 if err != nil {
  log.Fatal(err)
 }

 ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
 err = client.Connect(ctx)
 if err != nil {
  log.Fatal(err)
 }

 // ping the database
 err = client.Ping(ctx, nil)
 if err != nil {
  log.Fatal(err)
 }
 fmt.Println("Connected to MongoDB")
 return client
}

// MongoDB 客戶端實例
var DB *mongo.Client = ConnectDB()

// GetCollection 獲得數據庫集合
func GetCollection(client *mongo.Client, collectionName string) *mongo.Collection {
 collection := client.Database("golangAPI").Collection(collectionName)
 return collection
}

以上代碼簡單解釋下:

以上的設計并不是最好的,主要讓大家熟悉操作 MongoDB 的 API。

4、設置 API 路由處理程序和響應類型

Route Handler

完成后,我們需要在 route 文件夾中創建一個 user_route.go 文件,管理我們應用程序中所有與用戶相關的路由,如下所示:

package routes

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

func UserRoute(app *fiber.App) {
 // All routes related to users comes here
}

接下來,修改 main.go,路由交給上面的函數處理:

package main

import (
 "github.com/gofiber/fiber/v2"
 "github.com/programmerug/fibermongo/route"
)

func main() {
 app := fiber.New()
  
 // routes
 route.UserRoute(app)

 app.Listen(":2022")
}

響應類型

接下來,我們需要創建一個可重用的 struct 的來描述我們 API 的響應。為此,在 response 文件夾創建一個user_response.go文件并添加以下內容:

package response

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

type UserResponse struct {
 Status  int        json:"status"
 Message string     json:"message"
  Data    interface{} json:"data"
}

上面的代碼片段創建了一個通用的響應類型:UserResponse

5、REST API

接下來,我們需要一個 model 來表示我們的應用程序數據。

為此,我們在 model 中創建 user_model.go 文件并輸入如下內容:

package model

import "go.mongodb.org/mongo-driver/bson/primitive"

type User struct {
 ID       primitive.ObjectID json:"id,omitempty"
 Name     string             json:"name,omitempty" validate:"required"
 Location string             json:"location,omitempty" validate:"required"
 Title    string             json:"title,omitempty" validate:"required"
}

要解釋的是上面的 tag:validate,這是 github.com/go-playground/validator/v10 庫。

創建 User 端點

有了 model,我們現在可以創建一個函數來創建用戶。

在 controller 文件夾下創建文件 user_controller.go 并添加以下內容:

package controller

import (
 "context"
 "net/http"
 "time"

 "github.com/programmerug/fibermongo/config"
 "github.com/programmerug/fibermongo/model"
 "github.com/programmerug/fibermongo/response"

 "github.com/go-playground/validator/v10"
 "github.com/gofiber/fiber/v2"
 "go.mongodb.org/mongo-driver/bson/primitive"
 "go.mongodb.org/mongo-driver/mongo"
)

var userCollection *mongo.Collection = config.GetCollection(config.DB, "user")
var validate = validator.New()

func CreateUser(c *fiber.Ctx) error {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 var user model.User
 defer cancel()

 // validate the request body
 if err := c.BodyParser(&user); err != nil {
  return c.Status(http.StatusBadRequest).JSON(response.UserResponse{Status: http.StatusBadRequest, Message: "error", Data: &fiber.Map{"data": err.Error()}})
 }

 // use the validator library to validate required fields
 if validationErr := validate.Struct(&user); validationErr != nil {
  return c.Status(http.StatusBadRequest).JSON(response.UserResponse{Status: http.StatusBadRequest, Message: "error", Data: &fiber.Map{"data": validationErr.Error()}})
 }

 newUser := model.User{
  ID:       primitive.NewObjectID(),
  Name:     user.Name,
  Location: user.Location,
  Title:    user.Title,
 }

 result, err := userCollection.InsertOne(ctx, newUser)
 if err != nil {
  return c.Status(http.StatusInternalServerError).JSON(response.UserResponse{Status: http.StatusInternalServerError, Message: "error", Data: err.Error()})
 }

 return c.Status(http.StatusCreated).JSON(response.UserResponse{Status: http.StatusCreated, Message: "success", Data: result})
}

這段代碼比較多,簡單解釋下:

接著在 user_route.go 文件中綁定 API URL 和對應的 handler:

package route

import (
 "github.com/gofiber/fiber/v2"
 "github.com/programmerug/fibermongo/controller"
)

func UserRoute(app *fiber.App) {
 app.Post("/user", controller.CreateUser)
}

go run main.go 啟動程序,不出意外會看到如下輸出:

$ go run main.go
Connected to MongoDB

 ┌───────────────────────────────────────────────────┐
 │                   Fiber v2.26.0                   │
 │               http://127.0.0.1:2022               │
 │       (bound on host 0.0.0.0 and port 2022)       │
 │                                                   │
 │ Handlers ............. 1  Processes ........... 1 │
 │ Prefork ....... Disabled  PID .............. 7158 │
 └───────────────────────────────────────────────────┘

然后通過 curlie 測試創建用戶:

$ curlie POST -d  '{
    "name": "幽鬼",
    "location": "北京",
    "title": "Software Engineer"
}' http://localhost:2022/user

會看到如下輸出:

HTTP/1.1 201 Created
Date: Tue, 08 Feb 2022 03:08:17 GMT
Content-Type: application/json
Content-Length: 92

{
    "status": 201,
    "message": "success",
    "data": {
        "InsertedID": "6201de338ecf6d62fb799d62"
    }
}

然后你可以到 MongoDB 確認,數據有沒有寫入:

其他操作

接下來就是實現查找、更新和刪除。這塊內容不一一細講,只列出關鍵代碼。

先看完整的路由:

package route

import (
 "github.com/gofiber/fiber/v2"
 "github.com/programmerug/fibermongo/controller"
)

func UserRoute(app *fiber.App) {
 app.Post("/user", controller.CreateUser)
 app.Get("/user/:userId", controller.GetAUser)
 app.Put("/user/:userId", controller.EditAUser)
 app.Delete("/user/:userId", controller.DeleteAUser)
 app.Get("/users", controller.GetAllUsers)
}

通過 userId 獲取用戶信息中,因為 userId 是字符串,需要轉為 BSON 的 objectID。MongoDB 庫有一個專門的函數:

objId, _ := primitive.ObjectIDFromHex(userId)

具體的操作 MongoDB 的 API 可以查閱文檔:https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo。

6、結論

本文主要在于帶著大家完成一個基本的 CRUD 工作,讓大家熟悉 Fiber + MongoDB 構建 RESTful API,熟悉工作流程。同時了解相關庫的使用。

本文的完整代碼見:https://github.com/programmerug/fibermongo。

參考文章:https://dev.to/hackmamba/build-a-rest-api-with-golang-and-mongodb-fiber-version-4la0

此外,測試 API 時,大家可以使用自己喜歡的工具,比如 postman。

參考資料

[1]curlie:?https://curlie.io/

文章轉自微信公眾號@幽鬼

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
返回頂部
上一篇
2025 云端首選:5 大高效構建 REST API 的編程語言深度對比
下一篇
Scala中的API優先開發 | Zuplo博客
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
六月婷婷色综合| 免费国产亚洲视频| 亚洲激情五月婷婷| 国产电影一区二区三区| 国产精品亲子乱子伦xxxx裸| 麻豆精品久久精品色综合| 777亚洲妇女| 丝袜亚洲另类欧美| 欧美最新大片在线看| 国产精品传媒在线| 一本一道久久a久久精品综合蜜臀| 中文字幕欧美国产| 97久久人人超碰| 亚洲激情校园春色| 欧美一区二区在线不卡| 国内成人精品2018免费看| 国产欧美日韩亚州综合| 欧美专区在线观看一区| 久久se这里有精品| 亚洲免费电影在线| 日韩精品一区在线| 91在线观看污| 蜜臀av一级做a爰片久久| 久久精品夜色噜噜亚洲a∨| 懂色av中文一区二区三区| 亚洲欧美日韩中文播放 | 欧美日韩精品二区第二页| 麻豆国产精品官网| 国产女人aaa级久久久级| 欧美主播一区二区三区| 一区二区三区精品在线| 精品毛片乱码1区2区3区| 亚洲成人高清在线| 国产亚洲污的网站| 91视频在线观看| 精品一区二区三区日韩| 日韩一区二区免费电影| 欧美亚洲高清一区| 成人性生交大片免费看中文 | 久久99国产精品麻豆| 亚洲成人av中文| **欧美大码日韩| 国产日本一区二区| 国产亚洲成aⅴ人片在线观看| 777色狠狠一区二区三区| 91黄色激情网站| 91影视在线播放| 99天天综合性| 91小视频免费观看| 99久精品国产| 97se亚洲国产综合自在线观| 成人久久久精品乱码一区二区三区| 久国产精品韩国三级视频| 另类小说色综合网站| 视频一区二区不卡| 蜜臀国产一区二区三区在线播放| 亚洲va欧美va国产va天堂影院| 国产日韩欧美一区二区三区综合 | 欧美一级欧美三级在线观看| 日韩欧美一级特黄在线播放| 日韩免费看的电影| 久久影院电视剧免费观看| 国产色婷婷亚洲99精品小说| 中文字幕av资源一区| 日韩美女精品在线| 亚洲成精国产精品女| 久久精品国产亚洲5555| 粉嫩绯色av一区二区在线观看| 91老师片黄在线观看| 欧美精品v日韩精品v韩国精品v| 日韩欧美中文字幕精品| 国产精品美女视频| 日韩成人精品在线观看| 成人免费看视频| 91麻豆精品国产自产在线 | 久久久影视传媒| 亚洲精品久久嫩草网站秘色| 日韩不卡一区二区三区| 成人avav影音| 欧美精品久久一区二区三区| 欧美经典三级视频一区二区三区| 亚洲中国最大av网站| 久久精品理论片| 欧美亚洲国产一区二区三区va| 精品sm捆绑视频| 五月婷婷另类国产| 成人久久18免费网站麻豆 | 亚洲免费观看在线观看| 国产在线视频一区二区三区| aaa亚洲精品| 国产日韩三级在线| 麻豆91小视频| 欧美性欧美巨大黑白大战| 欧美激情中文字幕| 国产一区二区三区在线观看免费| 欧美亚洲高清一区二区三区不卡| 久久精品亚洲精品国产欧美| 奇米精品一区二区三区四区| 欧美日韩一级黄| 一区二区视频在线| 国产成人在线看| 国产午夜精品一区二区三区四区 | 日韩精品一区第一页| 欧美在线观看禁18| 亚洲卡通欧美制服中文| 91在线视频播放地址| 国产精品美女久久久久aⅴ国产馆| 麻豆国产一区二区| 精品久久久久久久久久久久包黑料 | 亚洲精品国产第一综合99久久| 国产成人精品在线看| 国产精品私房写真福利视频| 成人一区二区三区在线观看| 国产嫩草影院久久久久| www.日韩在线| 亚洲一级二级三级在线免费观看| 在线视频亚洲一区| 日韩精品国产欧美| 精品国产乱码久久| 成人va在线观看| 亚洲少妇30p| 欧美乱熟臀69xxxxxx| 免费观看日韩电影| 久久久不卡网国产精品二区| 蜜桃av一区二区| 久久久久久影视| 91视频在线观看| 日韩黄色免费网站| xvideos.蜜桃一区二区| 成人av电影在线| 日精品一区二区| 蜜桃久久久久久| 久久超级碰视频| 亚洲情趣在线观看| 久久精品亚洲精品国产欧美| 91在线观看成人| 亚洲色图制服丝袜| 欧美视频在线一区| 日韩电影免费在线看| 国产日韩欧美一区二区三区乱码 | 欧美一区二区三区男人的天堂| 精品国产亚洲一区二区三区在线观看| 五月激情综合网| 欧美精品久久天天躁| 五月婷婷欧美视频| 欧美mv日韩mv亚洲| 日本韩国一区二区| 日韩和欧美的一区| 中文字幕亚洲综合久久菠萝蜜| 欧美日韩在线直播| 国产一区二区日韩精品| 亚洲精品国产精华液| 国产日韩精品一区| 欧美一级高清片| 色婷婷综合激情| 豆国产96在线|亚洲| 免费观看成人av| 亚洲午夜电影网| 国产精品理伦片| 久久亚洲精品国产精品紫薇| 欧美三级电影在线看| 99久久99久久精品国产片果冻| 黑人精品欧美一区二区蜜桃| 亚洲一区二区偷拍精品| 国产精品美女久久久久久| 欧美精品一区二区三区四区| 欧美群妇大交群中文字幕| 色婷婷av一区二区三区大白胸| 国产成人在线看| 成人爽a毛片一区二区免费| 国产精品一区二区在线看| 久久精品国产一区二区三| 日韩综合在线视频| 偷拍自拍另类欧美| 水野朝阳av一区二区三区| 日日摸夜夜添夜夜添国产精品| 一二三区精品福利视频| 亚洲国产欧美在线人成| 午夜久久久影院| 日韩av电影免费观看高清完整版在线观看 | 国产夜色精品一区二区av| 欧美一级久久久| 日韩欧美资源站| 国产午夜精品久久久久久免费视| 精品美女被调教视频大全网站| 精品国产乱码久久久久久牛牛| 2021久久国产精品不只是精品| 精品国产免费一区二区三区四区| 精品国产乱码久久久久久1区2区| xf在线a精品一区二区视频网站| 国产日本一区二区| 悠悠色在线精品| 蜜臀精品一区二区三区在线观看 | 7878成人国产在线观看| 欧美精品一区二区精品网| 日本一区二区免费在线观看视频| 国产精品国产精品国产专区不蜜| 亚洲自拍偷拍综合| 国产一区二区久久| 在线观看日韩av先锋影音电影院|