目录
  • 协同开发时本地测试
  • GoFrame如何优雅的获得方法名
  • 巧用中间件
    • 中间件在登录之后设置关键信息到context上下文中
    • 业务逻辑直接通过context直接取值
  • case when
    • 总结

      协同开发时本地测试

      昨天的文章中提到了Go如何优雅的进行本地测试,今天分享一下:在多人协同开发中,如果大家都进行本地测试可能会出现的问题。

      最大的问题就是git合并的问题,大家都改这个test文件,就会导致有冲突。

      我们可以通过把test文件加到.gitignore中来解决这个问题。

      比如,我的测试文件所在目录是:app/system/script/test.go。 我就在.gitignore中添加:

      app/system/script/test.go
      

      这样我们就不用浪费时间在解决git冲突上了。

      GoFrame如何优雅的获得方法名

      今天又发现一个优雅的记录错误日志的神器:runtime.Caller(0)

      我们可以通过这个命令动态获取对应的方法,从而灵活的记录错误日志,方便跟踪定位问题。

      示例如下:

      shared.ApiLog()中第三个参数就是动态获取的方法名。

      //上下架
      func (s *goodsService) Shelves(req *goods_unify.DoShelvesReq, r *ghttp.Request) (err error) {
         defer func() {
            if err != nil {
               funcName, _, _, _ := runtime.Caller(0)
               shared.ApiLog(r, "error/client_server_goods", runtime.FuncForPC(funcName).Name(), err.Error())
            }
         }()
         err = service.GoodsUnify.DoShelves(r.Context(), req)
         if err != nil {
            return
         }
         return
      }
      

      巧用中间件

      比如在登录之后将登录信息写到上下文中,避免每次请求都携带登录信息。

      中间件在登录之后设置关键信息到context上下文中

      package middileware
      const (
         CtxAppKey         = "AK"
         CtxAppID          = "app_id"
         CtxChannel        = "channel_id"
      )
      var Middleware = middlewareShared{}
      type middlewareShared struct {
      }
      func (s *middlewareShared) Sign(r *ghttp.Request) {
         code = checkSignV2(r)
         r.Middleware.Next()
      }
      func checkSignV2(r *ghttp.Request) (code tools.Code) {
         code, appKey, applicationInfo, sign, parmas := getSignv2Params(r)
         if 1 != code.Code {
            return
         }
         bodyBytes, err := ioutil.ReadAll(r.Request.Body)
         if nil != err {
            code = code.UnKnow()
            return
         }
         r.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes)) // 关键点
         signRight, signParam := createSignV2(applicationInfo.Data.SecretKey, parmas, string(bodyBytes))
         if signRight != sign {
            code = code.SignErr("算法错误")
            return
         }
         r.SetParam("appKey", appKey)
         r.SetParam("appId", applicationInfo.Data.Id)
         r.SetCtxVar(CtxAppID, applicationInfo.Data.Id)
         r.SetCtxVar(CtxChannel, applicationInfo.Data.ChannelId)
         return
      }
      

      业务逻辑直接通过context直接取值

      通过r.Context().Value()获取数据:

      //校验请求方权限
      func checkLevel(r *ghttp.Request) (err error) {
         if gconv.Int(r.Context().Value(middileware.CtxChannel)) !=10 {
            err = errors.New("没有权限")
            return
         }
         return
      }
      

      case when

      当需要批量更新数据库时,case when是个不错的选择,我再深入了解一下用法,后面单独出一篇介绍 case when的文章。

      总结

      这篇文章总结了在协同开发中,可以把我们的调试文件添加到gitignore中,避免和其他同时因为调试文件而冲突,节省解决冲突的时间。

      通过GoFrame的runtime.Caller(0)获取方法名。

      巧用中间件,避免请求中携带登录信息。

      更多关于gitignore避免网络请求携带登录信息的资料请关注其它相关文章!

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。