1.有处理错误的中间件,有处理 panic 的中间件,这两个是不一样的
2.这里是错误类型,我们走处理错误的中间件
3.你想返回的 http 状态码是 500 ,同时错误信息是 db no ....
却被 401 处理了
对于这种情况是创建自定义错误类型,参考
https://github.com/ardanlabs/service6-video/tree/main/app/api/errs```
// Error represents an error in the system.
type Error struct {
Code ErrCode `json:"code"`
Message string `json:"message"`
}
```
这里的 message 就是我们的错误信息`db no ...`
这里的 code 是我们内部错误的编码,比如说授权错误,code = 1 ,数据库错误,code = 2
参考 code 设计
https://github.com/ardanlabs/service6-video/blob/main/app/api/errs/codes.go4.如何将 不同的错误转换为对应的 http 状态码,需要建立 code 和 http 状态码的 map 关系
参考
https://github.com/ardanlabs/service6-video/blob/main/api/http/api/mid/errors.go5.错误中间件处理错误
这里处理错误时,如果是我们自定义的错误,就将 code 转换为对应的 http 状态码,错误信息不变。
如果不是自定义错误,表明是未知错误,返回 {500,unknow err}
参考
https://github.com/ardanlabs/service6-video/blob/main/app/api/mid/errors.go```
func Errors(ctx context.Context, log *logger.Logger, handler Handler) error {
err := handler(ctx)
if err == nil {
return nil
}
log.Error(ctx, "message", "ERROR", err.Error())
// 这里判断是不是自定义错误
if errs.IsError(err) {
return errs.GetError(err)
}
return errs.Newf(errs.Unknown, errs.Unknown.String())
}
```