我正在学习 Koa JS 来构建小型 Web 应用程序的服务器端部分。在观看 youtube 教程和阅读指南时,我偶然发现了一句话:“一切都是中间件 [in Koa]。”
我已经阅读了关于中间件的维基百科文章并在谷歌上搜索了这个术语,我对中间件是什么有一个粗略的了解(有点像非常低级的东西和高级编程之间的中间层)。但我不明白“一切都是中间件”的说法在 Web 应用程序和 NodeJS 的上下文中意味着什么,以及为什么这是相关的。
我正在学习 Koa JS 来构建小型 Web 应用程序的服务器端部分。在观看 youtube 教程和阅读指南时,我偶然发现了一句话:“一切都是中间件 [in Koa]。”
我已经阅读了关于中间件的维基百科文章并在谷歌上搜索了这个术语,我对中间件是什么有一个粗略的了解(有点像非常低级的东西和高级编程之间的中间层)。但我不明白“一切都是中间件”的说法在 Web 应用程序和 NodeJS 的上下文中意味着什么,以及为什么这是相关的。
您可以将 Web 应用程序请求视为一个管道。管道由管道组成,每次您认为合适时,您都可以非常轻松地将新管道添加到管道中。
现在想象一下,您添加到管道中的每条管道都能够对流经管道的流体做一些特殊的事情。例如,如果水是流经管道的流体,您可以添加一个过滤任何污垢和杂质的管道,然后您可以添加一个将水加热到 80C 的管道,然后您可以添加一个将奶粉添加到管道中的管道水,然后添加另一个管道,向其中添加巧克力粉,在管道的末端,您会得到巧克力牛奶。
好吧,想象同样的事情,但是当你去的时候,流体就是你的 http 请求,你可以在你添加到管道的每个管道(即中间件)中对你的请求做各种事情,以这样的方式下一个管道将获得修改/改进的请求。随着您的进行,您可以逐渐构建您的 http 响应,这是您期望在管道的另一端出现的。
例如,您的请求正文可能会加密,因此您可以向管道添加一个解密管道,以便管道中的下一个管道可以处理解密的请求。其他管道可以查找查询参数并将它们放入哈希中,其他可以查找表单参数并执行相同的操作,其他可以提取标头值,一个处理 cookie 怎么样?等等等等。
因此,您可以看到您可以轻松地将越来越多的管道添加到您的管道中,每个管道都在做前一个没有做的事情。随着您的使用,您可以使用越来越多的信息改进请求,这有助于您最终构建响应以发送回客户端。
其中一些管道可用于拒绝请求,例如,在 REST API 中,您可以在开头添加一个管道来检查请求中发送的 API 密钥,如果无效,则立即丢弃请求,否则发送请求管道。
所以你可以看到一些管道作为过滤器来决定哪些请求必须被处理,哪些应该被丢弃或终止。其他管道可以充当转换器,通过向其添加更多数据或更改其中的数据来更改请求,然后将其传递给管道中的下一个管道。有些管道是路由器,即只有一个入口点但有多个出口点的管道;这种类型的管道可以根据其内容(即路径、内容类型、接受的语言等)通过不同的管道发送请求。最后,一些管道是终端,这意味着当你到达它们时,你就在管道的末端,无论成功与否,你都应该在那里提供响应。
许多 Web 框架都以这种方式工作,不仅仅是 Koa。Koa 是由 Express 的同一位创建者开发的,后者的工作方式类似,所以他们很自然地在 Koa 中重用了 Expeess 的最佳想法。然而,早期的框架(如 Java Servlet)可以使用称为过滤器的概念以类似的方式工作。所以,这并不新鲜,可能只是术语。
关于以下答案是 EJB 中间件吗?还是在 EJB 中使用中间件?根据 UNIX 哲学,我对中间件的解释被打分了:编写程序来处理文本流,因为这是一个通用接口
中间件是可以处理程序之间所有文本流的东西。
Koa 的意思是每个 Koa 对象都可以通过通用接口与每个其他 Koa 对象进行通信。(但我怀疑它是一个文本流。它可能是 JSON。或者两者兼而有之)
下面是中间件服务器介绍页面。我们可以将中间层作为客户端和业务逻辑之间的服务器,以提供抽象、安全、HA 和负载平衡以及更多的东西,如 EJB 支持、Servlet 容器......
https://www.applicationproductionsupport.com/p/middleware-servers.html