Node.JS 中间件从概念上讲是一种功能的封装方式, 具体来说就是封装在程序中处理 HTTP 请求的功能. 从实战上讲, 中间件只是一个有 3 个参数的函数: 一个请求对象, 一个响应对象和一个 next 函数.
Node.JS 中间件介绍:
中间件是在管道中执行的. 你可以想象一个送水的真实管道. 水从一端泵入, 然后在到达目的地之前还会经过各种仪表和阀门. 这个比喻中很重要的一部分是顺序问题, 你把压力表放在阀门之前和之后的效果是不同的. 同样, 如果你有个向水中注入什么东西的阀门, 这个阀门 "下游" 的所有东西都会含有这个新添加的原料. 在 Express 程序中, 通过调用 App.use 向管道中插入中间件.
在管道的最后放一个 "捕获一切" 请求的处理器是常见的做法, 由它来处理跟前面其他所有路由都不匹配的请求. 这个中间件一般会返回状态码 404(未找到). 那么请求在管道中如何 "终止" 呢? 这是由传给每个中间件的 next 函数来实现的. 如果不调用 next() , 请求就在那个中间件中终止了.
• 路由处理器 ( App.get , App.post 等, 经常被统称为 App.VERB ) 可以被看作只处理特定 HTTP 谓词 ( GET , POST 等) 的中间件. 同样, 也可以将中间件看作可以处理全部 HTTP 谓词的路由处理器(基本上等同于 App.all , 可以处理任何 HTTP 谓词; 对于 PURGE 之类特别的谓词会有细微的差别, 但对于普通的谓词而言, 效果是一样的).
• 路由处理器的第一个参数必须是路径. 如果你想让某个路由匹配所有路径, 只需用 /* . 中间件也可以将路径作为第一个参数, 但它是可选的(如果忽略这个参数, 它会匹配所有路径, 就像指定了 /\* 一样).
• 路由处理器和中间件的参数中都有回调函数, 这个函数有 2 个, 3 个或 4 个参数(从技术上讲也可以有 0 或 1 个参数, 但这些形式没有意义). 如果有 2 个或 3 个参数, 头两个参数是请求和响应对象, 第三个参数是 next 函数. 如果有 4 个参数, 它就变成了错误处理中间件, 第一个参数变成了错误对象, 然后依次是请求, 响应和 next 对象.
• 如果不调用 next() , 管道就会被终止, 也不会再有处理器或中间件做后续处理. 如果你不调用 next() , 则应该发送一个响应到客户端( res.send , res.JSON , res.render 等); 如果你不这样做, 客户端会被挂起并最终导致超时.
• 如果调用了 next() , 一般不宜再发送响应到客户端. 如果你发送了, 管道中后续的中间件或路由处理器还会执行, 但它们发送的任何响应都会被忽略.
来源: http://www.css88.com/qa/node-js/10686.html