goalng框架Gin中间件的c.Next()有什么作用?
感觉用不用效果一样的啊,看文档说是执行挂起程序,具体怎么好理解一些呢,每个中间件一定要用吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
感觉用不用效果一样的啊,看文档说是执行挂起程序,具体怎么好理解一些呢,每个中间件一定要用吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(10)
我们以上面的代码为例,加入了两个中间件
PrintRequest
PrintResponse
PrintResponse
这个中间件里,进行计时就ok了。 当你打印返回的response body的时候,也是一样的道理,中间件都会比handler先执行,但是没有handler,中间件怎么拿到 response body,这时候就要用到 c.Next() 先去 执行 余下的中间件和 handler,然后再回到我这个中间件里面c.Next 的主要作用大概就是这样了
中间件用的,不要管啥挂不挂起的,我估计是翻译的锅。
假如你用两个中间件
c.Next() 是让调该Handler 执行下一个Handler. 否则下一个Handler就执行不了。
c.next //使用Next,则内部会去执行该路由前的已注册的中间件
说到底就是继续执行下一个的意思。 你可以尝试把c.Next去掉,看看会发生什么
你写个类似用户认证的中间件就懂了,会用到
c.Next
c.Abort
,你再看看这些代码就懂了,单纯在中间件打印一些信息用不用是无所谓的,因为本来中间件就会一层一层执行可以看看源码中的解释,这个方法只在中间件中使用有意义,调用后马上执行各个 handler(这些 handler 中包含你注册在路由上的方法),最后会返回到中间件。
理解是加上c.Next()后马上开始执行下一个中间件,同时也执行c.Next()后的代码。不加上c.Next()则要等自身的handler执行完成才开始下一个中间件。下面是对比代码输出:
这个看下代码就很好理解了
handleHTTPRequest
(1)Next在Gin服务启后,相关请求进来时就会调用,用于执行为这个路由注册的所有中间件,正常情况下就是每个中间件都会顺序执行完成,所以就能解答你的疑问,为啥中间件不加Next也会执行下去。Next函数只是遍历执行所有handler而已,没啥
(2)在中间件中调用Next是啥效果?比如handlerA中调用了Next,那么在A中执行到Next时,Next函数会遍历执行余下的handler,完成后,Next返回到A中,继续执行完A
中间件可以理解为洋葱穿透。
c.Next() 之前的操作是在 Handler 执行之前就执行;
c.Next() 之后的操作是在 Handler 执行之后再执行;
然后你在Handler中输出一些内容就能发现。
Hello Before
在你的Handler之前就输出。Hello After
在之后输出。之前
的操作一般用来做验证处理,访问是否允许之类的。之后
的操作一般是用来做总结处理,比如格式化输出、响应结束时间,响应时长计算之类的。