中间件是在处理请求过程中可以进行一些额外操作的功能模块,可以用于处理请求、验证数据、打印日志等等。在 Express 中使用中间件非常方便,在页面处理前或者后做一些事情都可以通过中间件实现。本文将详细讲述在 Express 中如何使用中间件并给出相应示例代码。
中间件的基本结构
在 Express 中,每个中间件是一个 JavaScript 函数,该函数有 3 个参数:request 对象、response 对象和 next 函数。
function myMiddleware(req, res, next) { // 在这里编写你需要的操作代码 // 然后调用 next() 函数告诉 Express 跳转到下一个中间件或路由处理。 next(); }
Express 中的中间件,其实就是一个接收请求和响应的函数,这个函数有权访问请求和响应对象,并且可以进行一些操作之后手动调用 next() 函数将请求交给下一个中间件或路由处理器。
使用中间件
在 Express 中使用中间件,可以通过 app.use()
、 app.all()
和 router.all()
等多种方式。其中 app.use()
是最为常用的方式,使用前需要先导入 Express。
const express = require('express'); const app = express();
使用 app.use()
注册全局中间件
可以使用 app.use()
注册一个全局的中间件,这个中间件将在每个请求中都被执行。全局中间件的基本结构如下:
app.use(function (req, res, next) { // ... next(); })
app.use()
注册了一个全局中间件,当请求到来时就会被执行。其中, next()
函数会将控制权传递到下一个中间件或路由处理器。如果不调用 next()
,那么请求将会挂起不再响应。
简单的打印 hello world 示例
app.use(function(req, res, next) { console.log('hello world!'); next(); });
在每一个请求中都会执行这个函数,打印一段 hello world!
的字符串。
使用 app.use()
注册局部中间件
局部中间件是可以针对路由或路径单独设定的中间件,只针对特定请求路径起作用。和全局中间件相比,局部中间件只会在请求该路径时执行。
app.use('/users', function (req, res, next) { // ... next() })
它只对以 /users 开头的请求起作用。
通过设置 HTTP 头信息的中间件示例
// 设置 HTTP 头信息 app.use('/users', function(req, res, next) { // 设置 Content-Type 为 JSON 格式 res.setHeader('Content-Type', 'application/json'); next(); });
该中间件会在处理 /users
路径及其子路径时,将响应头信息的 Content-Type 设置为 JSON 格式。
使用 router.all()
注册路由中间件
使用路由中间件比较直观,其基本语法如下:
const router = express.Router(); // 每个路由模块需要创建一个 Router 示例 router.all('/users', function (req, res, next) { // ... next(); })
其中, router.all()
可以匹配任何 HTTP 请求方法,不管是 GET、POST、PUT还是 DELETE 请求,都可以被匹配。
路由中间件打印请求路径
-- -------------------- ---- ------- -- --------------- ----- ------- - ------------------- ----- ------ - ----------------- -------------------- ------------- ---- ----- - -- ------- --------------------------- ------- --- -------------- - -------
然后通过 app.use()
调用这个路由:
const usersRouter = require('./routes/users'); app.use(usersRouter);
当访问 /users 的时候,后台会打印一条访问路径信息。
异常处理中间件
异常处理中间件是一个可以捕获并处理错误的中间件,其回调函数中的第四个参数 err 才是真正的 Error 对象:
function errorHandler (err, req, res, next) { // 处理错误的逻辑 } app.use(errorHandler);
通过设置异常处理中间件返回错误信息
app.use(function(error, req, res, next) { const { message } = error; res.status(500).json({ message }); });
像这样定义了一个错误处理中间件,当某个中间件或路由出现 error 参数的时候,就会自动调用由 app.use()
注册的 errorHandler() 函数。
总结
本文详细介绍了在 Express.js 中如何使用中间件,包括全局中间件、局部中间件、路由中间件和异常处理中间件。在使用中间件的过程中,常常会涉及到异步操作,是需要开发者注重谨慎把握,建议细心阅读 Express 官方文档。
通过这篇文章我们可以理解:
- 了解了中间件的基本结构
- 理解了如何使用不同类型的中间件
- 掌握了在中间件处理函数中执行异步操作的用法
- 掌握了如何通过异常处理中间件对错误进行捕获和处理,以及如何返回错误信息。
中间件是 Express 框架设计的核心,合理使用中间件,能够提高代码层级的抽象度,增加代码的可读性,可拓展性以及可维护性等诸多方面都有极大的好处,这也是为什么要深入学习中间件的一个重要原因。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e57582f6b2d6eab30e6f1b