【go-zero】go-zero 框架踩坑指南 Q&A (持续更新中)

发布于:2022-12-06 ⋅ 阅读:(3148) ⋅ 点赞:(3)

一、问题汇总

1、field name is not set

【问题描述如下链接】
Q:go-zero大坑之field name is not set错误

【解决方案】
A:这种问题如连接中所示,确实是tag标记问题

  • 如果我们使用get请求,参数建议使用 form(tag中使用)
  • 如果我们使用post请求,参数建议使用json(tag中使用)

2、JWT 失效导致 CORS问题

【问题描述如下链接】
Q:Jwt expire lead to the Cors error. All route invalid #2163

【解决方案】
A;可以通过配置main方法中请求返回的header进行补齐
临时方案:https://github.com/zeromicro/go-zero/issues/1472

实际代码片段

func main() {
	flag.Parse()

	var c config.Config
	conf.MustLoad(*configFile, &c, conf.UseEnv())

	ctx := svc.NewServiceContext(c)
	server := rest.MustNewServer(c.RestConf, rest.WithUnauthorizedCallback(func(w http.ResponseWriter, r *http.Request, err error) {
		origin := "*"
		header := w.Header()
		header.Set("Access-Control-Allow-Origin", origin)
		header.Set("Access-Control-Allow-Methods", "GET, HEAD, POST, PATCH, PUT, DELETE")
		header.Set("Access-Control-Allow-Headers", "Content-Type, Origin, X-CSRF-Token, Authorization, AccessToken, Token, Range")
		header.Set("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers")

		header.Set("Access-Control-Max-Age", "86400")

		httpx.Error(w, xerr.NewEnsumError(xerr.LOGIN_ERROR))

	}), rest.WithCors("*"))
	defer server.Stop()

	handler.RegisterHandlers(server, ctx)
	httpx.SetErrorHandler(func(err error) (int, interface{}) {
		switch e := err.(type) {
		case *xerr.CodeError:
			return http.StatusOK, e.Data()
		default:
			logx.WithContext(context.Background()).Errorf(e.Error())
			return http.StatusOK, xerr.NewEnsumError(xerr.BAD_REQUEST_ERROR).(*xerr.CodeError).Data()
		}
	})
	fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
	server.Start()
}

3、go-zero的redis锁在go func() 失效

场景:

  • 注册接口,需要防止爆破,正常请求进来加锁
  • 注册成功后,通过go func() 实现异步,发送邮件通知
  • 此时在 go func里面,还是外侧,加入释放锁,都无法生效
// 1. New redislock
redisLock := redis.NewRedisLock(l.svcCtx.Config.Cache[0].NewRedis(), redisLockKey)
本文含有隐藏内容,请 开通VIP 后查看