本文主要是介绍gin使用中间件出错后不能用return终止,而应该使用Abort实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
gin使用中间件一般是在引擎Engine初始化的时候就绑定,也就是说在需要使用中间件才能访问资源的接口之前干这些事情。
也就是说,你现在有3个接口,比如一个用户登录(/api/v1/login), 一个管理员列表(/api/v1/list),一个添加管理员信息(/api/v1/add)。你现在的需求是查询管理员列表与添加管理员接口需要token鉴权才能访问,但是登录是不需要任何限制条件。
那么你就可以在管理员列表和添加信息接口之前加一个中间件,使用router.use(中间件)即可。
可以看下我的
我的鉴权里面是判断tokan是否有效,无效的话我就直接返回400并且return了。我的意思是说鉴权失败了那就return,不需要执行后续的list或者add接口。
但是。使用return压根不起作用。postman模拟器请求的时候发现控制台打印了错误信息如下:
Headers were already written. Wanted to override status code 400 with 200
然后返回结果不仅仅有token鉴权不通过的400,竟然也把查询结果给返回了。
这个结果很尴尬。
解决关键
中间件里面有错误如果不想继续后续接口的调用不能直接return,而是应该调用c.Abort()方法。
源码如下:
// Abort prevents pending handlers from being called. Note that this will not stop the current handler.
// Let's say you have an authorization middleware that validates that the current request is authorized.
// If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers
// for this request are not called.
func (c *Context) Abort() {c.index = abortIndex
}
这篇关于gin使用中间件出错后不能用return终止,而应该使用Abort实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!