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

作者:王中阳Go 时间:2022-10-24 13:20:00 

协同开发时本地测试

昨天的文章中提到了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的文章。

来源:https://juejin.cn/post/7111695942681657381

标签:gitignore,网络请求,登录信息
0
投稿

猜你喜欢

  • php利用ob_start()清除输出和选择性输出的方法

    2023-11-18 08:54:35
  • php实现网站留言板功能

    2023-11-23 21:06:36
  • 大家都来设计创意XP黑屏!

    2008-10-25 14:59:00
  • Python 统计数据集标签的类别及数目操作

    2023-04-08 12:04:09
  • Oracle数据库集复制方法浅议

    2010-07-21 12:50:00
  • python实现堆栈与队列的方法

    2023-06-19 02:57:04
  • 解决ajax+php中文乱码的方法详解

    2024-06-05 09:49:08
  • 在Python中使用判断语句和循环的教程

    2022-06-03 22:31:27
  • 在Linux系统上部署Apache+Python+Django+MySQL环境

    2024-01-14 00:51:15
  • Go系列教程之反射的用法

    2024-04-25 15:25:32
  • 嵌入式Web视频点播系统实现方法

    2007-10-10 21:17:00
  • Python增强赋值和共享引用注意事项小结

    2023-08-28 01:55:02
  • 打包FlaskAdmin程序时关于static路径问题的解决

    2023-01-11 20:01:26
  • Python中的几种矩阵乘法(小结)

    2021-11-29 23:51:33
  • GO语言文件的创建与打开实例分析

    2024-05-21 10:21:19
  • Python制作微信机器人教程详解

    2021-05-09 13:44:44
  • 创建、调用JavaScript对象的方法集锦

    2024-02-25 08:01:03
  • JavaScript性能优化--创建文档碎片

    2009-12-04 12:41:00
  • python机器学习MATLAB最小二乘法的两种解读

    2022-02-19 08:00:11
  • Python socket.error: [Errno 98] Address already in use的原因和解决方法

    2021-07-12 01:27:02
  • asp之家 网络编程 m.aspxhome.com