原生 Node 的单一请求处理函数,随着功能的扩张势必会变的越来越难以维护。而 Express 框架则可以通过中间件的方式按照模块和功能对处理函数进行切割处理。这样拆分后的模块不仅逻辑清晰,更重要的是对后期维护和开发非常有利。
本文将会详细介绍 Express 的使用,其中主要内容包括:
中间件是什么?
中间件栈以及请求处理的工作流。
中间件的使用。
如何实现自己的中间件。
Express 中常用的第三方中间件。
希望在读完本文后,你能对这个 Express 最主要的构成有更加清晰的认知。
中间件和中间件栈
对所有的 Web 应用来说它的处理流程可以简单描述为:监听请求、解析请求、做出响应。当然,Node 也遵循这一套流程,只不过将那些请求都转化为了 JavaScript 对象。
与原生 Node 代码不同的是,Express 会将上图中的最后一部分拆分为一组中间件函数(中间件栈)。所以Express 的工作流大致如下:
与纯 Node 不同的是,Express 中的中间件栈函数中除了表示请求和响应的参数外,还添加了第三个参数。该参数是一个函数对象,按照惯例我们称之为 next 。它用于传递中间件栈对某个请求的处理流。
在整个中间件栈的处理流中,最少有一个函数需要调用 res.end 方法结束响应处理。下面我们就通过搭建静态文件服务来加深对中间件栈的理解。
示例:一个静态文件服务器
创建一个文件夹并为此提供静态文件服务。你可以在文件夹中存放任何文件,例如:HTML 文件、图片。最终所有的这些文件都能通过示例程序进行网络访问。
该示例程序的功能大致包括:能够正确返回存在的文件;文件不存在时返回 404 错误;打印所有的访问请求。所以,该示例的中间件栈如下:
日志记录中间件。该函数会在终端打印所有的网络请求,并在打印介绍后继续下一个中间件函数。
静态文件发送中间件。如果访问的文件存在则返回给客户端。如果文件不存在则会跳到错误处理中间件。
404 处理中间件。如果文件不存在的话,该中间件将会给客户端发送 404 错误信息。
流程图如下: