协同开发巧用gitignore中间件避免网络请求携带登录信息

 更新时间:2022年06月22日 11:07:16   作者:王中阳Go  
这篇文章主要为大家介绍了协同开发巧用gitignore中间件避免网络请求携带登录信息

协同开发时本地测试

昨天的文章中提到了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避免网络请求携带登录信息的资料请关注脚本之家其它相关文章!

相关文章

  • Golang实现四种负载均衡的算法(随机,轮询等)

    Golang实现四种负载均衡的算法(随机,轮询等)

    本文介绍了示例介绍了Golang 负载均衡的四种实现,主要包括了随机,轮询,加权轮询负载,一致性hash,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Go语言学习之链表的使用详解

    Go语言学习之链表的使用详解

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将详细为大家介绍Go语言中链表的使用,感兴趣的可以了解一下
    2022-04-04
  • 详解Go语言中的作用域和变量隐藏

    详解Go语言中的作用域和变量隐藏

    这篇文章主要为大家介绍了Go语言中的作用域和变量隐藏,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Go语言基础变量的声明及初始化示例详解

    Go语言基础变量的声明及初始化示例详解

    这篇文章主要为大家介绍了Go语言基础变量的声明及初始化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步,早日升职加薪
    2021-11-11
  • Go语言中的通道chan使用指南

    Go语言中的通道chan使用指南

    Go语言的通道chan是实现并发编程的关键工具,主要用于goroutine之间的数据传输,本文主要介绍了通道的基本操作如创建、发送、接收和关闭数据,以及使用select语句进行多路复用和超时控制,感兴趣的可以了解一下
    2024-10-10
  • 解决go 生成的exe不在bin文件夹里的问题

    解决go 生成的exe不在bin文件夹里的问题

    这篇文章主要介绍了解决go 生成的exe不在bin文件夹里的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 探索Go语言中的switch高级用法

    探索Go语言中的switch高级用法

    在Go语言中,switch语句除了常见的用法外,还有一种不常用但有趣的写法,这种写法中,switch后面不跟任何表达式,而每个case后面跟的是返回bool类型的函数调用表达式,这实际上是一个等价于switch true的用法,通过从上到下逐一比较case后的表达式是否为true来决定执行哪个分支
    2024-10-10
  • Golang实现支付宝沙箱支付的方法步骤

    Golang实现支付宝沙箱支付的方法步骤

    本文主要介绍了Golang实现支付宝沙箱支付的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 使用go操作redis的有序集合(zset)

    使用go操作redis的有序集合(zset)

    这篇文章主要介绍了使用go操作redis的有序集合(zset),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • go-zero熔断机制组件Breaker接口定义使用解析

    go-zero熔断机制组件Breaker接口定义使用解析

    这篇文章主要为大家介绍了go-zero熔断机制组件Breaker接口定义使用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论