“一切都是中间件”

我正在学习Koa JS,用于构build小型Web应用程序的服务器端部分。 看着YouTube教程和阅读指南,我看到一句话:“一切都是中间件(在Koa)。

我已经阅读了关于中间件的维基百科文章,并且search了这个术语,而且我对中间件是什么(很低层的东西和高层次编程之间的中间层)有一个粗略的理解。 但是我不明白“一切都是中间件”这个说法在Web应用程序和NodeJS的背景下是什么意思,为什么这是相关的。

您可以将Web应用程序请求视为pipe道。 pipe道由pipe道组成,每当你认为合适的时候,你可以很容易地将新的pipe道添加到pipe道中。

现在想象一下,添加到pipe道中的每个pipe道都能够对stream经pipe道的stream体做一些特殊的处理。 例如,如果水是stream经pipe道的stream体,那么可以添加一个pipe道,用于过滤任何污垢和杂质,然后可以添加一个将水加热到80℃的pipe道,然后可以添加一个pipe道,水,然后添加另一个pipe道,添加粉末巧克力,并在pipe道的末端,你得到巧克力牛奶。

那么,想象一下同样的事情,但是当你走的时候,stream体就是你的http请求,你可以在你添加到stream水线的每一个pipe道(即中间件)中对你的请求做各种事情,以这种方式下一个pipe道将得到修改/改进的请求。 而随着你走,你可以逐渐build立你的http响应,这是你期望在pipe道的另一端出现的。

例如,请求的主体可能会encryption,因此您可以将一个解密pipe道添加到您的pipe道,以便pipe道中的下一个pipe道可以使用解密的请求。 其他pipe道可以查找查询参数并将它们放在哈希中,其他可以查找表单参数并执行相同的操作,其他可以提取标头值,如何处理cookie等等等等。

所以,你可以看到你可以很容易地将更多的pipe道添加到你的pipe道中,每一个pipe道都是前一个没有做的。 随着您的进步,您可以利用越来越多的信息来改善请求,并帮助您最终构build一个回复给客户的响应。

其中一些pipe道可用于拒绝请求,例如,在REST API中,您可以在开始时添加一个pipe道,检查请求中发送的API密钥,如果无效,立即丢弃该请求,否则发送请求下来的pipe道。

所以你可以看到一些pipe道作为filter来决定哪些请求必须被处理,哪些应该被丢弃或者终止。 其他pipe道可能充当变换器,通过向其中添加更多数据或更改其中的数据来更改请求,然后将其传递到pipe道中的下一个pipe道。 一些pipe道是路由器,即具有单个入口点但具有许多出口点的pipe道; 这种types的pipe道可以根据其内容(即path,内容types,接受的语言等等)通过不同的pipe道发送请求。 最后,一些pipe道是terminal,这意味着当你到达他们时,你是在pipe道的末端,你应该在那里提供一个响应,无论成功与否。

许多Web框架都以这种方式工作,不仅是Koa。 Koa是由Express的同一个开发者开发的,后者的工作方式也是类似的,所以重复使用Koa中的Expeess最好的想法是很自然的。 然而像Java Servlets这样的早期版本的框架可以使用一个名为filters的概念以类似的方式工作。 所以,这不是新的,可能是术语。

在下面的答案是EJB中间件? 还是EJB中使用的中间件? 我根据UNIX的理念,为我对中间件的解释做了标记:编写处理文本stream的程序,因为这是一个通用接口

那么中间件就可以处理程序之间的所有文本stream。

Koa所说的每个Koa对象都可以通过通用接口与其他Koa对象进行通信。 (但是我怀疑这是一个文本stream,可能是JSON,或者两者兼有)

把中间件看作装饰器的function。 http://cdn.rawgit.com/jonathanong/koajs/master/index.html