学了一部分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#请输入密码|密码长度不够"`
排查问题这个过程花费了挺多时间的,后来去官方文档看知识点,根据实例在本地测试了,最后才发现是分隔符写错的问题。