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

中间件(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


猜你喜欢

  • RxJS 实现 Websocket 通信之 RxJS-websocket 使用教程

    什么是 RxJS RxJS 是一个响应式编程库,用于处理异步和基于事件的程序,它基于观察者模式和迭代器模式,提供了一种方便的处理异步事件的方式。 RxJS 的一些特性包括:基于流的编程、异步编程、可组...

    1 年前
  • 基于 Web Components 技术的开源组件库

    Web Components 是一个由 W3C 提出的标准化的技术规范,它提供了一种新的开发 web 应用的方式。Web Components 技术可以让 web 开发者在开发过程中更快速、更简单地创...

    1 年前
  • Sequelize 中使用事务执行多步数据库操作的方法和实例

    Sequelize 是一款 Node.js 中流行的异步 ORM(Object-Relational Mapping)框架,可帮助我们轻松地进行数据库的访问和操作。

    1 年前
  • Docker 构建过程中出现的 “no such file or directory” 错误

    前言 在使用 Docker 进行前端项目的构建时,有时会遇到 "no such file or directory" 错误。这通常是由 Dockerfile 中指定的文件或目录不存在导致的,本文将介绍...

    1 年前
  • Kubernetes 执行 Pod 时的权限问题

    背景 Kubernetes 是一个广泛使用的容器编排工具,它的主要功能是对 Docker 容器进行编排和管理。在 Kubernetes 中,一个运行的应用程序由一个或多个容器组成,并被封装在一个称为 ...

    1 年前
  • Koa 框架使用 JWT 实现 Token 认证

    在许多 Web 应用程序中,认证是不可避免的一部分。Token 认证是现代 Web 应用程序中最流行的认证方法之一,它的目的是验证对 Web API 的访问请求是否合法。

    1 年前
  • Tailwind CSS 中的栅格系统使用详解

    Tailwind CSS 是一个快速上手的 CSS 框架,其栅格系统是其中一个重要的组成部分。本文将深入介绍 Tailwind CSS 的栅格系统,包括如何在项目中使用,以及如何自定义栅格系统。

    1 年前
  • 使用 CSS Flexbox 布局创建响应式的卡片布局

    在前端开发中,布局是一个重要的方面。好的布局可以让网页看起来更加美观、易于阅读,并且可以提高用户体验。而使用 CSS Flexbox 布局,可以更加方便地实现多种复杂布局,其中响应式卡片布局就是一种非...

    1 年前
  • PM2 中常见的几个错误及解决方式

    1. PM2 运行失败 当使用 PM2 运行应用程序时,有时候会发生运行失败的情况。这通常是因为应用程序不存在或者 PM2 无法访问应用程序。 解决方式: 确认应用程序是否已经存在。

    1 年前
  • 解决 LESS 编译过程中遇到的递归问题

    LESS 是一种 CSS 预编译器,允许编写更高级的 CSS 代码,并将其编译成浏览器可解释的标准 CSS 代码。但是,在使用 LESS 编译过程中,遇到递归(循环调用)问题时,会导致编译失败。

    1 年前
  • 如何在 ECMAScript 2021 中正确使用 destructuring assignment

    在ECMAScript 2021中,destructuring assignment是一个非常强大的功能,它可以帮助我们更加灵活地处理数组和对象。在本文中,我们将介绍如何在这个新的版本中正确使用des...

    1 年前
  • ES6 中类的继承和 super 关键字的使用方式

    随着 JavaScript 的发展,ES6 引入了类(class)的概念,使得代码的组织和维护更加方便和规范。类在代码复用和面向对象编程方面发挥着重要作用,在实践中,类的继承和 super 关键字是我...

    1 年前
  • 前端自动化测试神器 Jest 详解

    在前端开发中,自动化测试是一个非常关键的步骤,可以保证代码的质量,减少出错的风险,提高开发效率。而 Jest 是一款非常优秀的前端自动化测试框架,广泛应用于前端开发中。

    1 年前
  • iOS Safari 上的响应式设计差异

    在前端开发中,响应式设计通常指的是根据不同设备的屏幕大小和分辨率等因素来自适应调整页面布局和样式,使用户在不同设备上能够有更好的浏览体验。然而,虽然同样是采用响应式设计,但在不同设备和浏览器环境下,页...

    1 年前
  • 使用 Mocha 和 Chai 测试 Node.js 应用程序见证之书的案例研究

    在开发 Node.js 应用程序时,如何保证代码质量和功能正确性是非常重要的。而测试是保证代码质量的重要手段之一。本文将介绍使用 Mocha 和 Chai 测试 Node.js 应用程序的方法,并以见...

    1 年前
  • React Native 和 Web 开发的详细对比

    在现代的互联网应用中,前端技术的发展日新月异。React Native 和 Web 开发都是非常热门的前端技术,它们既有相似之处,也有明显的区别。在本文中,我们将详细对比 React Native 和...

    1 年前
  • 经典 CSS Reset 对 Web 设计的影响

    在 Web 设计中,样式表是实现页面美观的重要工具。但是不同的浏览器对 CSS 的实现方式有所不同,有些样式可能会因为浏览器的默认样式而导致页面的风格不统一。为了解决这个问题,Eric Meyers ...

    1 年前
  • ES9 中取消异步操作方法 AbortController 深度实践

    ES9 异步操作方法中新增了一个 AbortController 类,用于取消异步操作。通过创建一个 AbortController 实例,可以生成一个绑定 AbortSignal 的 AbortCo...

    1 年前
  • Headless CMS 在数字化出版中的应用

    在数字化出版领域,管理和展示大量的书籍是一个非常具有挑战性的工作。传统的 CMS 系统虽然能够提供基本的网站管理功能,但是在展示和管理复杂的书籍内容时,往往会遇到很多问题。

    1 年前
  • SASS 中 Unit 的用法与注意事项

    简介 SASS 是一种 CSS 预处理器,它提供了一些额外的功能,比如变量、嵌套等,可以使样式表的编写更加方便。其中一个重要的功能是 Unit 单位的使用。 本文将介绍 SASS 中 Unit 的用法...

    1 年前

相关推荐

    暂无文章