- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Go Fiber 框架系列:中间件由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
大家好,我是 polarisxu.
Middleware(中间件) 是一个 Web 框架重要的组成部分,通过这种模式,可以方便的扩展框架的功能。目前 Go Web 框架都提供了 Middleware 的功能,也有众多可用的 Middleware.
Fiber 也是如此,官方提供了众多的 Middleware,方便用户直接使用。本文先看看 Fiber 中 Middleware 的定义,然后介绍 Fiber 中的几个 Middleware,最后自己实现一个 Middleware.
Fiber 文档中关于 Middleware 的说明:中间件是在 HTTP 请求周期中链接的函数,它可以访问用于执行特定操作(例如,记录每个请求或启用 CORS)的上下文.
设计用于更改请求或响应的函数称为中间件函数。Next 是 Fiber 路由器函数,当它被调用时,执行与当前路由匹配的下一个函数.
可见,中间件其实和 Handler 是一样的,只是用途有区别。或者说至少签名是一样的,这样才能更好的形成一个链.
因此,Fiber 中的中间件签名如下:
Fiber 没有专门定义中间件类型.
此外,从 fiber.App.Use 方法也可以看到,中间件和普通的 Handler 并无本质不同.
而 fiber.Handler 类型只是 func(*fiber.Ctx) error 的别名:
这点上,Gin 框架和 Fiber 是类似的。不过,有一些框架,比如 Echo,专门定义了中间件类型。但不管怎么样,中间件的本质和普通路由 Handler 是类似的.
所有内置的中间件可以在 fiber 项目的 middleware 子包找到,这些中间件对应的文档在这里:https://docs.gofiber.io/api/middleware.
以 Recover 中间件为例,看看官方中间件的实现方法,我们自己的中间件可以参照实现.
1)签名 。
上文说了,中间件就是一个 Handler,因此这里 New 函数返回 fiber.Handler,这就中间件.
至于 New 函数的参数不做任何要求,只需要最终返回 fiber.Handler 即可.
2)配置 。
一个好的中间件,或通用的中间件,一般都会有配置,让中间件更灵活、更强大。看看 Recover 的配置定义:
具体配置是什么样的,需要根据中间件的功能来定义.
不过,配置中 Next 这个行为,很多中间件都可以有.
3)默认配置 。
一般的,会提供一个默认配置,方便使用。而且,大部分时候,使用默认配置即可。Recover 的默认配置如下:
如果这样调用 recover.New() ,会默认使用上面的默认配置.
最后看看 New 函数的代码:
以上就是一个 Fiber 标准中间件的写法.
具体使用时就是:app.Use(recover.New()).
当然,如果只是自己项目使用,可以不用写配置.
通过 Recover 学习到了中间件的标准写法,如果中间件只在自己项目使用,不需要灵活性,完全可以采用简单的写法.
这其实也是一个 Handler,对吧。无非最后调用的是 ctx.Next,而不是 ctx.JSON 之类的.
使用时这样:
只要理解中间件的机制,不需要拘泥于具体形式,可以灵活变换中间件的写法.
本文讲解了什么是中间件,Fiber 中间件长什么样以及对内置中间件 Recover 的学习,最后自己实现一个简单的中间件。掌握了 Fiber 的中间件,相信对其他 Go Web 框架的中间件的学习也就不难了,因为都差不多.
原文链接:https://mp.weixin.qq.com/s/NL6MYQpvVOyJREiVX_DAgQ 。
最后此篇关于Go Fiber 框架系列:中间件的文章就讲到这里了,如果你想了解更多关于Go Fiber 框架系列:中间件的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在学习 ruby.. 并且我是编程新手 fiber = Fiber.new do |first| second = Fiber.yield first + 2 end puts fiber
如何使用 C++ boost 停止(中断)光纤? 例如 fiber.stop() 我如何使用 c+ boost 执行 fiber join(time)(默认 api 不接受最长等待时间)? 例如: f
Fibers被定义为轻量级线程,线程具有优先级,因为它们是抢占式调度的。然而,由于纤维是合作的,它们是否也有优先级? 最佳答案 不,它们本质上没有优先级,因为在协作式多任务处理中,上下文切换目标总是由
我很难理解我应该在我正在处理的代码中的何处实现wrapAsync/bindEnvironment。我正在使用 http/knox 调用 url 并将其上传到我的 S3 存储桶,该存储桶可以正常工作,但
meteor 纤维“同步”模式让我发疯。这是一个简单的代码示例: var feedsData = feeds.fetch(); // [{_id: "1234"}, {_id: "6789", url
void helloFiber(boost::fibers::future &f) { cout pm; boost::fibers::future ft = pm.get_futu
我想知道如何暂停 ruby 中的 Root Fiber(如果可能)。 我有这个 Sinatra 应用程序,我正在使用 EventMachine 对外部 API 进行异步调用。在 API 响应我之前
大家好,我是 polarisxu。 Middleware(中间件) 是一个 Web 框架重要的组成部分,通过这种模式,可以方便的扩展框架的功能。目前 Go Web 框架都提供了 Middlew
我想在 ZIO Fibers 上使用组合器 orElse。 从文档: 如果第一个纤维成功,则合成的纤维将成功,其结果;否则,组成的光纤将以第二条光纤的退出值完成(无论成功或失败)。 import zi
我有以下 ZIO 程序,其中包含两个永久运行的进程: for { .. numberProvider <- numberProvider(queue).fork //
我正在使用 Fibers 来处理不同代码块之间的调度,事实证明这比尝试管理线程要简单得多,因为我的用例相当简单(并且一次只涉及运行一个脚本)。不幸的是,我需要偶尔“杀死”Fiber 的能力,但 Fib
我很难学习 Fibers\coroutines 背后的想法和 Crystal 中的实现。 我希望这是问这个问题的正确地方,我会完全接受“不在这里”的答案:) 这是我在 Ruby 中处理多线程的常用方法
我负责一个 Windows 应用程序,该应用程序加载用 C++ 编写的插件“脚本”dll。 该应用程序公开了一个基于 Win32 纤维的 API,以允许插件 dll 中的 C++“脚本”使用“yiel
部署到其他服务器后,捆绑的 node.fibers 无法加载,并出现以下错误: /home/ec2-user/bundle/server/node_modules/fibers/fibers.js:1
我正在尝试为 Fabrikam Fiber 调用中心下载 Asp.Net 应用程序。 Larry guger 在他关于 http://channel9.msdn.com/Events/TechEd/N
我已成功使用本地上下文通过自定义中间件设置数据库查询结果。我试图了解如何对用户进行身份验证,然后从数据库中提取其详细信息并将其注入(inject)上下文中。这已经完成了。 路由上 final方法上的本
当我收到一个包含要上传到服务器的文件列表的post 请求时,如果我知道它的名称,我可以获取特定文件 c.FormFile("文件名") 但是,如果事先不知道文件名,我该如何遍历该列表中的文件呢?我没有
当我收到一个包含要上传到服务器的文件列表的post 请求时,如果我知道它的名称,我可以获取特定文件 c.FormFile("文件名") 但是,如果事先不知道文件名,我该如何遍历该列表中的文件呢?我没有
我正在使用类星体光纤来监听和处理 QueueObjectChannel 上的消息。我不确定应该使用什么对象作为光纤之间的消息队列。我遇到的问题是我不明白应该将什么传递到 QueueObjectChan
我有以下函数,用作 Windows Fiber 的入口点。 void foo(void*) { for(int i =0; i < 10; ++i) { doStuff(); } } 现在我在
我是一名优秀的程序员,十分优秀!