Express.js 中实现自定义中间件的最佳实践

阅读时长 7 分钟读完

中间件(Middleware)是 Express.js 框架中最重要的概念之一,可以为我们的 Web 应用程序提供很多有用的功能,例如路由控制、错误处理、身份验证和日志记录等。Express.js 中默认提供的中间件已经很强大,但有时候我们需要自定义一个中间件以满足特定的需求。

本篇文章将介绍在 Express.js 中实现自定义中间件的最佳实践,包括中间件的基本原理、实现方式、使用方法以及实例应用。

中间件的原理

在 Express.js 中,中间件是由一个或多个函数组成的处理管道,每个函数都接收三个参数:请求对象(request)、响应对象(response)和下一个中间件函数(next)。其中下一个中间件函数next是用于指示 Express.js 调用管道中下一个中间件的函数,如果没有指定调用下一个中间件,那么响应就会停留在当前中间件。

例如,我们可以编写一个简单的普通中间件,输出 “Hello world” 至控制台:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

----- ---------- - ----- ---- ----- -- -
    ------------------ --------
    -------
-

--------------------

这个中间件接收 req 和 res 两个参数,然后输出 “Hello world” 到控制台,最后调用 next() 函数。由于中间件没有处理响应对象,所以响应会停留在当前中间件,最终返回一个空响应。

中间件的实现方式

Express.js 中有两种方式实现中间件,一种是函数式中间件,另一种是路由式中间件。

函数式中间件

函数式中间件是最简单的自定义中间件,它是一个函数,根据需要可以接收不同的参数。

下面给出一个例子,这个中间件接收一个字符串作为参数,然后把字符串打印到控制台上。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

----- ---------- - ----- -- -
    ------ ----- ---- ----- -- -
        -----------------
        -------
    --
--

------------------------- ---------

在这个例子中,我们实现了一个函数式中间件,它接收一个字符串作为参数,并返回一个新的函数式中间件。这个新的中间件会把传入的字符串打印输出,然后调用 next() 函数。

路由式中间件

路由式中间件是基于路由的中间件,它可以绑定到特定的路由上,而且对于非特定的路由不会被执行。路由式中间件可以带有任意数量的函数参数,这些参数函数可以处理请求和响应,完成具体的业务逻辑。

下面给出一个例子,这个中间件会记录请求响应的时间和路径信息,并作为响应写入到客户端。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

----- ---------- - ----- ---- ----- -- -
    ----- ---- - --- -------
    ------------------ -------------------------------
    -------
--

----- ---------- - ----- ---- ----- -- -
    ------------------ --------------
    -------
--

----- ------------ - ----- ---- ----- -- -
    ------------------ ----- ----- ---------------------------
--

------------ ----------- ----------- --------------

在这个例子中,我们定义了三个函数式中间件:timeLogger、pathLogger 和 sendResponse,其中前两个用于记录请求响应的时间和路径信息,第三个则是发送响应给客户端。

这三个函数式中间件通过 app.get() 方法绑定到 / 路由上,因此只有当请求路径为 / 时,这三个中间件才会被执行。在执行这三个中间件的过程中,它们会依次处理请求和响应,并通过 next() 函数调用下一个中间件。

中间件的使用方法

在 Express.js 中使用中间件非常简单,只需要通过 app.use() 方法把中间件注册到应用程序上即可。

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

----- ---------- - ----- ---- ----- -- -
    ------------------ --------
    -------
-

--------------------

在这个例子中,我们定义了一个中间件 middleware,然后通过 app.use() 方法把它注册到应用程序上。

实例应用

在实际应用中,我们经常需要自定义中间件来完成特定的业务需求。下面给出两个例子,分别是身份验证中间件和跨域中间件。

身份验证中间件

身份验证是保障 Web 应用程序安全性的关键性组成部分,我们可以编写一个身份验证中间件来确保只有授权用户才能访问网站或特定的区域。下面给出一个身份验证中间件的例子:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

----- ---- - ----- ---- ----- -- -
    ----- ----- - --------------------------
    -- ------ --- -------- -
        -------
    - ---- -
        ---------------------------------- ------- ------ ----- --------
    -
--

----- ------------ - ----- ---- ----- -- -
    ----------------- -- -- ----------
--

------------ ----- --------------

在这个例子中,我们定义了两个函数式中间件,auth 中间件用于身份验证,sendResponse 中间件用于发送响应。auth 中间件会检查请求头中是否包含授权 token,如果包含则通过 next() 函数调用下一个中间件发送响应,否则返回 401 状态码和错误信息。

跨域中间件

由于浏览器的同源策略,当我们在一个网页中访问另一个域名的资源时,会受到限制,这时候可以使用跨域中间件来解决这个问题。下面给出一个跨域中间件的例子:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

----- --------- - ----- ---- ----- -- -
    ----------------------------------------- -----
    ------------------------------------------ ---------------------------------
    ------------------------------------------ -------------------------------
    -------
--

-------------------

在这个例子中,我们定义了一个函数式中间件 allowCors,它通过设置 Access-Control-Allow-Origin、Access-Control-Allow-Headers 和 Access-Control-Allow-Methods 三个响应头来解决跨域问题。在应用程序中使用这个中间件之后,就可以轻松访问不同域名的资源了。

总结

中间件是 Express.js 框架中非常重要的组成部分,可以为我们的 Web 应用程序提供很多有用的功能。在本篇文章中,我们介绍了在 Express.js 中实现自定义中间件的最佳实践,包括中间件的基本原理、实现方式、使用方法以及实例应用。希望通过本文的介绍,您可以更好地理解中间件的工作原理,掌握自定义中间件的编写技巧,从而更好地使用 Express.js 框架完成自己的项目。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c3671683d39b488176bb96

纠错
反馈