Express.js 中间件教程

什么是 Express.js 中间件

Express.js 是一个流行的 Node.js Web 应用框架,它支持路由、模板引擎、静态文件服务等功能。Express.js 中间件是一个特殊的函数,它可以在请求处理过程中,对请求对象和响应对象进行处理,从而实现一些有用的功能。

Express.js 中间件可以用于如下情况:

  • 记录请求日志
  • 认证用户身份
  • 解析请求数据
  • 做一些安全检查,防止攻击
  • 缓存某些请求结果
  • 动态生成一些公共数据

对于大型应用程序来说,中间件是非常有用的,因为它可以提高代码的重用性、可维护性和可扩展性。

中间件的使用方法

在 Express.js 中,中间件可以使用 app.use()router.use() 方法来添加。比如:

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

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

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

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

在上面的例子中,我们添加了一个简单的中间件,它会打印出请求时间。这个中间件会被任何请求处理函数之前执行。

注意,每个中间件函数都有三个参数:请求对象 req、响应对象 res 和下一个中间件函数 nextnext 是一个函数,当它被调用时,表示当前中间件已经执行完毕,需要将控制权交给下一个中间件或路由。

不仅仅是 app.use()router.use() 方法,还有很多其他的方法可以添加中间件,比如:

  • app.get()app.post() 等路由方法可以接受中间件作为参数
  • app.all() 方法可以匹配所有 HTTP 动词的请求,并且接受中间件作为参数
  • app.use()router.use() 方法可以添加多个中间件,它们会按照添加的顺序执行

中间件的分类

中间件可以分为以下几类:

应用级中间件

应用级中间件绑定到 app 对象上,并且会影响整个应用程序的行为。它们可以使用 app.use() 方法来添加。

比如:

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

路由级中间件

路由级中间件绑定到 router 对象上,只会影响特定的路由。它们可以使用 router.use() 方法来添加。

比如:

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

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

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

错误处理中间件

错误处理中间件可以捕获路由或中间件函数中抛出的异常,并且返回错误信息给客户端。错误处理中间件需要一个额外的参数,比如:

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

第三方中间件

除了自己编写中间件之外,还可以使用许多第三方中间件,比如:

  • body-parser:用于解析请求体中的数据。
  • compression:用于对响应数据进行压缩。
  • cors:用于跨域请求处理。
  • helmet:用于增强应用程序的安全性。

中间件的执行顺序

当多个中间件函数都绑定在同一个路由上时,它们的执行顺序是非常重要的。Express.js 中间件的执行顺序可以分为如下几类:

先执行应用级中间件,后执行路由级中间件

比如:

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

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

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

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

当处理 /users 路由时,控制权将首先交给 app.use() 绑定的第一个中间件函数。然后,控制权交给 app.use() 绑定的第二个中间件函数。最后,控制权交给 router.use() 绑定的中间件函数,然后才会执行 /users 路由的处理函数。

先执行错误处理中间件,后执行普通中间件

比如:

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

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

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

当处理任何路由时,如果 app.use() 绑定的中间件函数抛出错误,将会直接跳转到错误处理中间件,而不会去执行其它的中间件函数或路由处理函数。

中间件函数中使用异步操作

中间件函数中经常会使用异步操作,比如从数据库中读取数据、发送 HTTP 请求等。为了正确地处理异步操作,中间件函数必须使用 next() 函数来通知 Express.js,控制权可以传递给下一个中间件函数或路由处理函数。

比如:

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

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

当处理 /users 路由时,控制权将首先交给 app.use() 绑定的第一个中间件函数。然后,控制权将在异步操作完成后,才会交给 /users 路由的处理函数。

总结

Express.js 中间件是一个非常有用的功能,它可以提高代码的重用性、可维护性和可扩展性。通过本教程,您应该了解了以下内容:

  • 中间件的使用方法和分类
  • 中间件的执行顺序和异步操作
  • 一些常用的第三方中间件

在编写 Express.js 应用程序时,您应该熟悉中间件的用法,这样才能编写出更加健壮、可维护的代码。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64603486968c7c53b01f6c56


猜你喜欢

  • Express.js 总线模式实现指南

    什么是总线模式 总线模式是一种于多个组件之间通信的模式。通过 totalbus(总线) 实现,组件不再直接相互通信而是通过总线传递消息,从而实现解耦。 在现代web应用程序开发中,总线模式是一种十分使...

    1 年前
  • 如何在 LESS 中使用变量设置文字阴影效果

    在网页设计中,文字阴影效果是一种常见的美化方式,它可以使文字内容更加清晰明了、立体有形,同时也更加突出和引人注目。在 LESS(CSS 预处理器)中,我们可以通过使用变量来简化阴影效果的代码编写,提高...

    1 年前
  • 如何设计一个基于 Flexbox 的响应式布局

    什么是 Flexbox? Flexbox 是一种 CSS 布局模式,它是 flexible box 的缩写。它使得在容器中的子元素可以自适应大小和位置,并且可以响应容器的空间。

    1 年前
  • Koa 集成微信公众号 SDK 的开发指南

    本文将介绍如何在 Koa 应用中集成微信公众号 SDK,实现快速开发并接入微信公众平台的功能。同时,本文也会介绍一些常见的技术问题和解决方案,帮助读者更深入地理解和使用微信开发技术。

    1 年前
  • Material Design 中的徽章效果及实现教程

    徽章是在网站或移动应用中显示未读消息、通知或计数等重要信息的一种常用方式。在 Material Design 中,徽章效果特别注重颜色和动效,营造出美观、简洁、易读的用户界面。

    1 年前
  • MongoDB 分片集群架构的搭建

    前言 MongoDB 作为一款 NoSQL 数据库受到了越来越多开发者的青睐。其自身具有高可扩展性、高性能等特点,可以应用于数据分析、大型网站、移动应用等众多领域。

    1 年前
  • # 在 ECMAScript 2020 中使用 new.target 来保证正确的构造函数调用

    在 ECMAScript 2020 中使用 new.target 来保证正确的构造函数调用 在 JavaScript 中,构造函数是一个非常重要的概念。构造函数用于创建对象并对其进行初始化,通常使用 ...

    1 年前
  • TypeScript+Angular 学习笔记之 HelloWorld

    前言 TypeScript 是 Microsoft 推出的一种新型编程语言,它是 JavaScript 的超集,在保留 JavaScript 的特性的基础上增加了类型的支持,使得代码更加清晰、稳定和易...

    1 年前
  • Deno 中的可读流和可写流

    什么是可读流和可写流 可读流和可写流是 Node.js 中常用的概念,它们被广泛用于处理大型数据集,比如读取文件、处理网络数据等。可读流是一种用于读取数据的接口,可写流则是一种用于写入数据的接口。

    1 年前
  • 使用 Enzyme 和 Jest 测试 React 组件,让单元测试变得更简单

    使用 Enzyme 和 Jest 测试 React 组件,让单元测试变得更简单 前言 随着前端技术的发展,React 已经成为了现代 Web 开发中非常重要的一部分,并且得到了广泛的应用。

    1 年前
  • babel-plugin-import 的实现原理和使用

    介绍 在前端开发中,我们通常会使用许多第三方的库来帮助我们实现一些功能,如 React、AntD 等等。但是,如果在项目中频繁地引用这些库中的模块,就会使得项目的文件体积变得很大。

    1 年前
  • Hapi.js 与 Nginx 结合使用的详解

    背景 随着前端技术的不断发展和普及,前端开发逐渐成为了一个独立的职业方向。前端开发工作中,要将用户的请求传递给后端服务,通常会采用一些流行的 Node.js 框架,如 Express 或 Hapi.j...

    1 年前
  • Tailwind CSS 与 React 如何兼容?

    Tailwind CSS 是一个快速、强大的 CSS 框架,它封装了许多常见的 CSS 样式和布局,为前端开发人员节省了设计和编写 CSS 的时间。React 是一种流行的 JavaScript 库,...

    1 年前
  • Docker 部署容器遇到 "No space left on device" 错误解决方法

    Docker 是一款流行的容器化技术,它能够帮助我们快速构建、测试和部署应用程序。但是在使用 Docker 进行容器部署时,有时会遇到 "No space left on device" 错误。

    1 年前
  • 无障碍性测试工具:Web 开发必须了解的重要工具

    无障碍性 (Accessibility) 是指我们采用的设计和技术,能够使得所有人都能够使用和享受 Web 上的内容和服务,而不受其身体或心理能力的限制。无障碍性的实现可以提高用户体验、扩大受众群体、...

    1 年前
  • Cypress 测试时如何覆盖不同用户角色?

    Cypress 是现代化的前端自动化测试工具,它非常适用于前端开发团队进行端到端测试。而测试中的不同用户角色是一个常见的情景,因为在不同角色下用户会有不同的访问权限和交互方式,这也需要在测试中进行覆盖...

    1 年前
  • ES12 提案:类的私有方法

    简介 在日常的前端开发中,我们经常会使用类进行面向对象的编程。然而,ES6 中的类虽然带来了许多方便和灵活性,但是在类的私有方法方面还存在一些不足。因此,ES12 在这方面进行了改进,提供了一种新的类...

    1 年前
  • 如何使用 JWT 认证 RESTful API

    什么是 JWT JWT 是一种基于 JSON 的开放标准,用于在各方之间安全地传输声明。JWT 可以被用于认证和授权。它在使用上很简单,可以单独使用或与其他认证方法结合使用。

    1 年前
  • Chai.js 中 expect 断言的事件捕获

    前言 Chai.js 是 JavaScript 中一个非常流行的断言库,它为开发者提供了多种风格的断言语法和丰富的插件系统,用于编写清晰、简洁和易于维护的测试代码。

    1 年前
  • ES6 中的 Object 扩展

    在 ES6 中,Object 扩展提供了一些新的方法和语法,让 JavaScript 对象的使用更加方便和灵活。在本文中,我们将详细讨论 ES6 中的几个重要的 Object 扩展。

    1 年前

相关推荐

    暂无文章