[express.js学习笔记]理解Router

(本文内容纯属个人理解,仅供学习探讨)

博主的工作用的是Java Web,私下对JavaScript很感兴趣,也就接触了Node.js,听过Node一般使用Express来搭建Web服务器,就找到了Express,开始阅读文档和例子。

发现官方文档API页面的导航列出了express的几个核心的类(对象):

1. express

2. Application

3. Request

4. Response

5. Router

其中,按照我的理解,express是一个Application对象的工厂类,其实它还是Router对象和serve-static中间件的工厂类;

另外的Application,Request,Response类比Java Web,分别对应于ServletContext,HttpServletRequest,HttpServletResponse,比较好理解;

令我比较不解的是Router,以及它与Application的关系,我只知道Router的作用是Routing(路由),我能隐约感觉到它应该是担当MVC中的Controller。

我开始仔细的阅读文档,发现"middleware(中间件)"在文中出现的频率特别高,看来要搞清楚这个问题,得先进一步理解中间件的含义。

于是,我开始查找“中间件”的定义。我在维基百科中看到,有不同前辈对"中间件"下过定义,抽象地讲,描述都是同一个意思,只是在不同的应用场景中有不同的具体描述。

有一个定义是,位于网络传输层(TCP/UDP)(终端)应用程序之间的软件就称为"中间件",Web服务器就是一种"中间件",它位于传输层与运行在其上的Web应用(如一个购物网站)之间。

"中间件"可以由很多层的"中间层"有序组成,express的Router就是用来作为独立于应用的"中间层"的对象。

通过对比Application和Router的API,我们发现他们有很多相同的方法,作用也一样,那他们有什么关系呢?

文档中提到了,Application中有一个内置的Router,这就解释了Application与Router为什么有那么多相同的方法。

一个Router可以use()其他多个Router,同理一个Application可以use()多个Router。

说Router是独立于应用的,是相对于Application中的内置Router而言,独立的Router可以被不同的应用(Application)或其他Router使用(use())。

 一个Router中可以有多个handler来处理不同route(大概相当于URI,或Java Servlet中的url-pattern,或Spring MVC的requestMapping等)和不同方法(post,get,put,delete)的请求,如果一个handler处理完之后没有作出响应(response),则应该交给下一层的handler(或者其他Router的handler)处理。

同一个请求会被所匹配route的所有Router的所有handler按照挂载的顺序(沿着"中间件"的栈)进行处理,并沿着反方向进行响应。

如果熟悉Java的Filter,或者Struts的Interceptor等过滤器拦截器技术的工作原理,那Router就是在express中的Filter或者Interceptor。

 

posted @ 2017-03-16 20:51  waychan23  阅读(2304)  评论(0编辑  收藏  举报