go-zero(五) 模板定制

go-zero 模板定制

goctl 代码生成是基于 go 的模板去实现数据驱动的,实际开发中,使用goctl 生成的代码,并不完全符合我们的需求。

例如,我们刚刚的使用错误管理,我们需要在handler中返回的错误信息。

一、生成模板

首先,我们需要初始化模板文件。通过运行goctl template init 命令,可以将模板文件下载到本地。

sql2pb>goctl template init -home ./
  • home 是存储模板的路径

执行命令后,指定目录中会生成以下文件和文件夹结构:

├─api
├─docker
├─gateway
├─kube
├─model
├─mongo
├─newapi
└─rpc

这些目录对应了go-zero中不同模块的模板,提供了服务生成的基本结构。

二、修改模板

这里我们演示如何修改handler.tpl模板,以便在处理请求时返回更合适的错误信息。

打开handler.tpl文件,可以看到生成的代码框架。我们将在处理请求时引入新的错误处理逻辑,使其更符合业务需求。以下是修改后的模板代码:

package {{.PkgName}}

import (
    "net/http"
    xhttp "github.com/zeromicro/x/http"  //导入zeromicro库
    "github.com/zeromicro/go-zero/rest/httpx"
    {{.ImportPackages}}
)

{{if .HasDoc}}{{.Doc}}{{end}}
func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        {{if .HasRequest}}var req types.{{.RequestType}}
        if err := httpx.Parse(r, &req); err != nil {
            //httpx.ErrorCtx(r.Context(), w, err)
            xhttp.JsonBaseResponseCtx(r.Context(), w, err)
            return
        }

        {{end}}l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
        {{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
        if err != nil {
            //httpx.ErrorCtx(r.Context(), w, err)
            xhttp.JsonBaseResponseCtx(r.Context(), w, err)
        } else {
            {{if .HasResp}}xhttp.JsonBaseResponseCtx(r.Context(), w, resp){{else}}httpx.Ok(w){{end}}
        }
    }
}

修改说明

  • 我们使用了 xhttp.JsonBaseResponseCtx 方法来返回错误信息,这样可以确保客户端得到统一风格的错误响应。
  • 处理请求的逻辑保留了原有结构,但在错误处理的方式上作了调整,以更好地符合业务需求。

自定义规则:

  • 在 goctl 提供的有效数据范围内修改,即不支持外部变量
  • 不支持新增模板文件
  • 不支持变量修改

三、根据模板生成代码

完成模板的修改后,可以使用 goctl命令来生成新代码。以下是命令示例:

goctl api go --api user.api --dir ./  --home ../sql2pb    

--home 指定我们刚刚下载的模板路径, 默认值为 ${HOME}/.goctl

在代码生成完成后,我们可以查看生成的 handler 文件,以确认我们的修改是否成功。新的 handler 文件应当能够根据我们自定义的模板返回整洁的错误响应。


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容