面向 NodeJS 开发人员的 Golang REST API - 第一部分
在第一部分,我们将搭建项目的基础架构。首先,请确保已安装 Go 1.13 版本。在 Mac 系统上,我建议使用 Homebrew 来安装。
Go 模块初始化
首先,创建一个文件夹,用于存放此项目的代码。在该文件夹内运行命令,go mod init todo其中 todo 将是项目的名称。在NodeJS中,我们执行npm init.
设置数据库连接
在这个项目中,我们将使用go-pg库,因此需要运行 `go install go-pg` 来安装它go get github.com/go-pg/pg。这将安装该库及其所有依赖项。
对于有NodeJS经验的人来说,这相当于 ` go install go-pg` npm install。在项目根目录下创建一个名为 `go-pg` 的文件夹postgres,并在其中创建一个同名文件,并将 `.go` 作为扩展名。
在这个文件中,我们将创建一个名为 New 的函数,它的唯一作用是返回指向数据库实例的指针。
// postgres/postgres.go
package postgres
import (
"github.com/go-pg/pg/v9"
_ "github.com/lib/pq"
)
func New(opts *pg.Options) *pg.DB {
db := pg.Connect(opts)
return db
}
我喜欢让软件包的根目录与文件夹名称保持一致,这是我个人喜欢遵循的约定,这样可以简化操作。
设置基本处理程序/端点
处理程序(Handler)类似于我们的控制器。应用程序的逻辑将在这里与客户端(在本例中为 REST API)绑定。
我们还会设置中间件并将其绑定到路由器实例。路由方面,我们使用Chi,可以通过安装它go get github.com/go-chi/chi。
我发现Chi 是Go 语言Chi中最好的路由库。原因首先是它的外观与我在NodeJS中一直使用的路由库 Express 非常相似。 此外,该库遵循标准库的签名。而这正是Go社区所期望的。
// handlers/handlers.go
package handlers
import (
"time"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
)
type Server struct {
}
func setupMiddleware(r *chi.Mux) {
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Compress(6, "application/json"))
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Use(middleware.URLFormat)
r.Use(middleware.Timeout(60 * time.Second))
}
func NewServer() *Server {
return &Server{}
}
func SetupRouter() *chi.Mux {
server := NewServer()
r := chi.NewRouter()
setupMiddleware(r)
server.setupEndpoints(r)
return r
}
接下来,我们需要一个基础接口。在本部分(第一部分)中,我们将只实现它的基本框架。
// handlers/endpoint.go
package handlers
import "github.com/go-chi/chi"
func (s *Server) setupEndpoints(r *chi.Mux) {
r.Route("/api/v1", func(r chi.Router) {
r.Route("/users", func(r chi.Router) {
})
})
}
设置主函数
在Go 语言中,所有代码都从 Main 函数开始。因此,在我们的代码中,我们将最终初始化数据库和路由。
我们还要确保路由器运行在指定的端口上。我们会检查环境变量是否提供了相应PORT的变量,否则我们将使用其他方法8081。
这相当于NodeJS中的 ` __init__` 方法。
const port = process.env.PORT || 8081;
main.go所以,请在项目根目录创建一个文件,内容应该如下所示。
// main.go
package main
import (
"fmt"
"log"
"net/http"
"os"
"github.com/go-pg/pg/v9"
"todo/handlers"
"todo/postgres"
)
func main() {
DB := postgres.New(&pg.Options{
User: "postgres",
Password: "postgres",
Database: "todo_dev",
})
defer DB.Close()
r := handlers.SetupRouter()
port := os.Getenv("PORT")
if port == "" {
port = "8081"
}
err := http.ListenAndServe(fmt.Sprintf(":%s", port), r)
if err != nil {
log.Fatalf("cannot start server %v", err)
}
}
结论
如果你喜欢这篇教程,别忘了订阅我的电子报。视频链接就在文章顶部。
如有任何疑问,欢迎在下方评论区留言。
祝您编程愉快 :)
这是我博客上的一篇跨平台文章。您可以在这里阅读原文:https://equimper.com/blog/golang-rest-api-for-nodejs-developer-part-1
文章来源:https://dev.to/equimper/golang-rest-api-for-nodejs-developer-part-1-54i0