GoFrame——请求校验Parse()方法返回err之坑

GoFrame请求校验Parse方法返回err之坑

    • 代码示例
    • 错误分析
    • 解决办法

学了一部分GoFrame的使用,自己尝试去写项目练习,但是有个知识点搞混了,导致程序异常。

Debug时,发现请求参数是有的,而且也能将参数转换为结构体,但是总是得不到预期结果。

首先去排查err值,但是竟然是个空字符串,就让人摸不着头绪,不知道错误在哪,以下是场景复现。

代码示例

错误代码,标签和消息中间的正确分隔符不是|,而是#。:

// LoginRequest 登录参数
type LoginRequest struct {
	UserName string `p:"username" v:"required|账号不能为空"` // 分隔符写错
	Password string `p:"password" v:"required|密码不能为空"` 
}

func (a *Admin) Login(r *ghttp.Request) {
	var (
		data  *LoginRequest
		err   error
		admin *admin.Entity
	)
	// 问题就出现在这里 err 并没有返回我们期望的错误,而是返回了一个空字符串
	if err = r.Parse(&data); err != nil {
		fmt.Printf("-----err[%s]-----\n", err.Error())
		response.FailJSON(true, r, err.Error())
	}
	// 验证登录
	admin, err = service.LoginCheck(data.UserName, data.Password)
	fmt.Println("admin", admin)
	response.SusJSON(true, r, "登录成功", admin)
}

错误分析

控制台输出:

2020-07-08 00:18:25.248 33000: http server started listening on [:8199]
-----err[]-----
2020-07-08 00:22:02.494 200 "POST http localhost:8199 /gateway/admin/login HTTP/1.1" 0.009, [::1], "", "PostmanRuntime/7.26.1"

我是使用Postman发起的请求,可以看到,它返回的是200,浏览器查看请求是正确的,但是页面得到Json响应总是有问题,错误信息msg一直是个空字符串

按照我们的预期,如果发生了错误,应该打印出堆栈信息,最起码把错误打印出来,但是框架底层并没有返回真正的错误,而是返回了一个空字符串,这就很让开发者费解,底层实现还没去研究,先记录下今天这个坑

解决办法

正确代码:

 v:"required#账号不能为空"` 
 v:"required#密码不能为空"` 

另外|分隔符用来分隔同类型内容,如标签之间或错误信息的分隔,如下:

v:"required|length:6,30#请输入密码|密码长度不够"`

排查问题这个过程花费了挺多时间的,后来去官方文档看知识点,根据实例在本地测试了,最后才发现是分隔符写错的问题。

啊,太坑了,如果开发者写错了,不应该打印错误堆栈信息吗,竟然什么都不输出,这错误有点低级啊…

你可能感兴趣的:(后端框架,#,GoFrame)