gin使用中间件出错后不能用return终止,而应该使用Abort实现 - Go语言中文社区

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
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010918487/article/details/82997792
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-01 12:33:51
  • 阅读 ( 2807 )
  • 分类:Go Web框架

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢