- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在学习 Koa JS 来构建小型 Web 应用程序的服务器端部分。在观看 youtube 教程和阅读指南时,我看到了一句话:“Everything is middleware [in Koa]”。
我已经阅读了关于中间件的维基百科文章并在谷歌上搜索了该术语,我对什么是中间件有一个粗略的了解(介于非常低级别的东西和高级编程之间的中间层)。但我不明白“一切都是中间件”的说法在 Web 应用程序和 NodeJS 的上下文中意味着什么,以及为什么这是相关的。
最佳答案
您可以将 Web 应用程序请求视为管道。管道由管道组成,每次您认为合适时,您都可以非常轻松地向管道添加新管道。
现在想象一下,您添加到管道中的每根管道都能够对流经管道的流体执行一些特殊操作。例如,如果水是流经管道的流体,您可以添加一个管道来过滤任何污垢和杂质,然后您可以添加一个将水加热到 80C 的管道,然后您可以添加一个向管道中添加奶粉的管道水,然后添加另一个管道,向其中添加巧克力粉,在管道的末端,您会得到巧克力牛奶。
好吧,想象一下同样的事情,但是随着你的进行,流体就是你的 http 请求,你可以在你添加到你的管道的每个管道(即中间件)中对你的请求做各种各样的事情,在这样一个下一个管道将获得修改/改进请求的方式。随着您的进行,您可以逐渐构建您的 http 响应,这是您希望在管道的另一端出现的内容。
例如,您的请求正文可能已加密,因此您可以向管道添加解密管道,以便管道中的下一个管道可以处理解密的请求。其他管道可以查找查询参数并将它们放入哈希中,其他管道可以查找表单参数并执行相同操作,其他管道可以提取 header 值,处理 cookie 的管道呢?等等。
因此,您可以看到您可以轻松地向管道中添加越来越多的管道,每个管道都在做前一个管道没有做的事情。随着您的前进,您可以使用越来越多的信息改进请求,这有助于您最终构建响应以发送回客户端。
其中一些管道可用于拒绝请求,例如,在 REST API 中,您可以在开头添加一个管道,用于检查请求中发送的 API key ,如果无效,则立即丢弃该请求,并且否则将请求发送到管道。
所以你可以看到一些管道作为过滤器工作,决定哪些请求必须被处理,哪些应该被丢弃或终止。其他管道可以充当转换器,通过向请求添加更多数据或更改其中的数据来更改请求,然后将其传递给管道中的下一个管道。一些管道是路由器,即具有单个入口点但具有多个导出点的管道;这种类型的管道可以根据其内容(即路径、内容类型、接受的语言等)通过不同的管道发送请求。最后,一些管道是终端,这意味着当您到达它们时,您就在管道的末端,您应该在那里提供响应,无论成功与否。
很多 web 框架都是这样工作的,不仅仅是 Koa。 Koa 由 Express 的相同创建者开发,后者以类似的方式工作,因此他们在 Koa 中重用 Expeess 的最佳创意是很自然的。然而,早期的框架(如 Java Servlet)可以使用称为过滤器的概念以类似的方式工作。所以,这不是新的,可能只是术语。
关于node.js - "Everything is middleware",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23980325/
如果尚未预先设置,则是否有一种快捷方式可以选择某个点以下和某个点以上的所有代码,那么开发该代码的最佳方法是什么? 最佳答案 在Windows上尝试Cmd + Shift +上/下或Ctrl + Shi
我想使用 serverAlias 将 Anything.com/xxx 重定向到 Anything.com。 谢谢吉恩 最佳答案 如果您的意思是将文字路径/xxx 重定向到/,则可以使用 Redire
我决定在引用字符串/整数等字段时使用 this.variableName。那也会包括 ArrayList、ListBox 等吗?喜欢: private ListBox usersListBox; pr
在R中,我经常将dplyr的select与everything()结合使用 df %>% select(var4, var17, everything()) 上面的示例例如将对数据帧的列进行重新排序,
我有一个插件 $.fn.dropDown = function(options){ this.each(function(){ var $this= $(this);
我正在为本质上是一个 n 层协作应用程序(不是企业级,只是一个具有显着增长潜力的小型项目)开发一种新架构,我已经在尝试训练自己使用 IoC,并且在某种程度上, TDD,而且我想知道,一般来说,手动编写
我有一个 VBA 宏代码。它的主要目的是将数据从一个工作簿复制到另一个工作簿;只是行在变化。宏足够快,直到我在目标工作表上进行了一些条件格式设置。 我的问题是是否有任何方法可以在宏运行时禁用 Exce
我想使用 dplyr 计算数据框中的唯一组合 我尝试了以下方法: require(dplyr) set.seed(314) dat % group_by(a,b,c) %>% summarise(n
Everything是一个文件搜索程序。由于其作者尚未发布源代码,我想知道它是如何工作的。 它如何能如此高效地索引文件? 它使用什么数据结构进行文件搜索? 它的文件搜索怎么能这么快? 引用其常见问题解
我是 JSF 新手(4 天前才开始学习),我对 h:outputText 的用法有点困惑。我知道这是一个简单的标签,但在我见过的大多数示例中,它用于输出非常简单(无需转义)的非 i18n 文本。例如(
这个问题纯粹是装饰性的: 我想删除给定字符串的最后一个“/”之后的所有文本。所以如果输入是 mkdir -p $DEST/Users/Peter/Dropbox/Public/Vacation/P10
我正在尝试制作一个 android 应用程序,它可以在所有内容(每个应用程序或每个 Activity )上显示小部件(按钮、文本框等) 很像 facebook 聊天头或 float 通知 到目前为止,
重复: Is there a way to indicate the last n parameters in a batch file? how to get batch file paramete
我正在学习 Koa JS 来构建小型 Web 应用程序的服务器端部分。在观看 youtube 教程和阅读指南时,我看到了一句话:“Everything is middleware [in Koa]”。
我想捕获字符串中直到(不包括)# 符号的所有内容。 # 字符可能存在也可能不存在(如果不存在,则应捕获整个字符串)。 为此,RegEx 和 C# 代码是什么?我已经尝试过:([^#]+)(?:#) 但
我正在尝试将我的更新文件推送到 github 上的远程存储库,使用 git 版本 1.8.4.2 运行 OSX Snow Leopard。 我已经成功地完成了 git init 然后是 git add
我查看了此处针对我遇到的问题的当前解决方案,但他们提供的答案似乎并没有解决让推送工作的问题。 我有一个名为“dev”的本地分支,它应该跟踪一个远程分支“v1.0-7.22-dev”。 我克隆了 rep
在某些语言中(特别是动态类型的语言),一切,甚至是值,都是一个对象。就像在 Ruby 中一样,你可以说: 5次{做某事} [ 5 是一个对象,而不是原始类型,因此您可以在其上调用方法 (times)。
每次被问到这个问题时,答案都是像这样使用否定前瞻:(?!x) 很遗憾,我必须在 vb6 中实现美国运通支票,它不支持负向前瞻或负向后视。 是否可以使用最古老的正则表达式实现来匹配除 34、37 之外的
我是一名编码员(我使用的是 Mac),我使用的计算机是一台“不应该被弄乱”的计算机。我想安装一些命令行程序,但我希望能够以某种方式删除我所做的一切。 我知道,我不应该做任何以防万一的事情。 但是,我想
我是一名优秀的程序员,十分优秀!