mohuishou / blogComment

mohuishou's blog comment
0 stars 0 forks source link

post/go-training-week4-protoc-gen-go-gin #243

Closed utterances-bot closed 2 years ago

utterances-bot commented 3 years ago

Go工程化(五) API 设计下: 基于 protobuf 自动生成 gin 代码 - Mohuishou

mohuishou 的 技术博客, 关注云原生, Go, K8s, Docker, 微服务等技术

https://lailin.xyz/post/go-training-week4-protoc-gen-go-gin.html

keepljg commented 3 years ago

这种代码怎么debug

mohuishou commented 3 years ago

@keepljg 这个和自己写的代码没有什么本质的区别的

keepljg commented 3 years ago

我的意识是 这个自动生成http server代码的怎么debug 入口这个方法 protogen.Options{ParamFunc: flags.Set,}.Run(...) 怎么执行的 看代码不好看懂 下那个debug下

mohuishou commented 3 years ago

我的意识是 这个自动生成http server代码的怎么debug 入口这个方法 protogen.Options{ParamFunc: flags.Set,}.Run(...) 怎么执行的 看代码不好看懂 下那个debug下

这个是 protogen go 的一个方法,这个需要在执行 protoc 的时候去调用它,我一般是打 log 或者用单元测试来 debug,还没用过 dlv 这种来 debug 这个工具

isqiguo commented 3 years ago

我使用你这个,使用proto文件生成了gin和grpc得代码,但是我发现,如果发生了错误,返回到前端得永远是没有err这一项,您能给我解答一下嘛?我的qq是94583210。请您来给我指点指点

isqiguo commented 3 years ago

虽然我知道你写的这个自动生成得gin文件里面没有返回,但是他不是放在了gin得context里面了嘛?那前端如何拿到呢?

mohuishou commented 3 years ago

虽然我知道你写的这个自动生成得gin文件里面没有返回,但是他不是放在了gin得context里面了嘛?那前端如何拿到呢?

只要你返回的 err 满足了这个接口就能返回错误信息

type iCode interface{
    HTTPCode() int
    Message() string
    Code() int
}

这个对应了返回的 httpcode 以及 返回 body 中的 codemsg

isqiguo commented 3 years ago

那这个怎么去满足呢?不是很懂,您这个接口不是自动生成得嘛?

mohuishou commented 3 years ago

那这个怎么去满足呢?不是很懂,您这个接口不是自动生成得嘛?

@isqiguo

这个没有自动生成,这个需要自行写一个 Error Struct 来满足,不同公司或者个人对错误的定义不一样,所以我这里只是定义了一个接口 举个例子,然后在使用的时候,在底层抛这个业务错误码就行了,具体 err 相关的实践可以看这篇文章 https://lailin.xyz/post/go-training-03.html


// Code 错误码
type Code int

// Error for error
func (code Code) Error() string {
    return fmt.Sprintf("WantCode: %d, msg: ", code) + code.String()
}

// Code Code
func (code Code) Code() int {
    return int(code)
}

// Message Message
func (code Code) Message() string {
    return code.String()
}

// HTTPCode HTTPCode
func (code Code) HTTPCode() int {
    c2 := code / 1000000

    switch {
    case code == 0:
        return http.StatusOK
    case code > 200 && code < 600:
        return int(code)
    case c2 > 200 && c2 < 600:
        return int(c2)
    default:
        return http.StatusInternalServerError
    }
}

// Errorf Error
func (code Code) Errorf(msg string, v ...interface{}) error {
    return errors.Wrapf(code, msg, v...)
}
isqiguo commented 3 years ago

您写的这个例子缺少了String()这个方法,然后我是copy您得示例,还是缺少了err,可能是我有些一根筋,您能给一份完整的示例嘛? 我是这样写得。return nil, util.Code(400).Errorf("账号或密码错误", err) postman返回得错误是: { "code": 400, "data": null, "msg": "" }

感谢您。

mohuishou commented 3 years ago

您写的这个例子缺少了String()这个方法,然后我是copy您得示例,还是缺少了err,可能是我有些一根筋,您能给一份完整的示例嘛? 我是这样写得。return nil, util.Code(400).Errorf("账号或密码错误", err) postman返回得错误是: { "code": 400, "data": null, "msg": "" }

感谢您。

https://github.com/mohuishou/protoc-gen-go-gin/tree/master/example 看这个例子吧

isqiguo commented 3 years ago

您得这个例子我看过。主要是想明白如何去重写您iCode接口会更好,可能我比较愚钝,问您那么多。

mohuishou commented 3 years ago

您得这个例子我看过。主要是想明白如何去重写您iCode接口会更好,可能我比较愚钝,问您那么多。

刚刚更新了,加了 iCode 接口的实现

isqiguo commented 3 years ago

非常谢谢您,我重新git clone下来。麻烦您了!

mohuishou commented 3 years ago

非常谢谢您,我重新git clone下来。麻烦您了!

太客气了

isqiguo commented 3 years ago

加个好友常联系阿。大佬,我也在深圳。。

victory460 commented 2 years ago

为什么不直接把gin.ctx带到service handle中? https://github.com/mohuishou/protoc-gen-go-gin/issues/7