什么是 Express.js 中间件
Express.js 是一个流行的 Node.js Web 应用框架,它支持路由、模板引擎、静态文件服务等功能。Express.js 中间件是一个特殊的函数,它可以在请求处理过程中,对请求对象和响应对象进行处理,从而实现一些有用的功能。
Express.js 中间件可以用于如下情况:
- 记录请求日志
- 认证用户身份
- 解析请求数据
- 做一些安全检查,防止攻击
- 缓存某些请求结果
- 动态生成一些公共数据
对于大型应用程序来说,中间件是非常有用的,因为它可以提高代码的重用性、可维护性和可扩展性。
中间件的使用方法
在 Express.js 中,中间件可以使用 app.use()
或 router.use()
方法来添加。比如:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- --- - --------- -- ----- ------------- ---- ----- -- - --------------------- ----------- ------ -- -- -- ------------ ----- ---- -- - --------------- -------- -- -- ----- ---------------- -- -- - --------------------- --
在上面的例子中,我们添加了一个简单的中间件,它会打印出请求时间。这个中间件会被任何请求处理函数之前执行。
注意,每个中间件函数都有三个参数:请求对象 req
、响应对象 res
和下一个中间件函数 next
。next
是一个函数,当它被调用时,表示当前中间件已经执行完毕,需要将控制权交给下一个中间件或路由。
不仅仅是 app.use()
或 router.use()
方法,还有很多其他的方法可以添加中间件,比如:
app.get()
,app.post()
等路由方法可以接受中间件作为参数app.all()
方法可以匹配所有 HTTP 动词的请求,并且接受中间件作为参数app.use()
或router.use()
方法可以添加多个中间件,它们会按照添加的顺序执行
中间件的分类
中间件可以分为以下几类:
应用级中间件
应用级中间件绑定到 app
对象上,并且会影响整个应用程序的行为。它们可以使用 app.use()
方法来添加。
比如:
app.use((req, res, next) => { console.log('请求的时间是', Date.now()) next() })
路由级中间件
路由级中间件绑定到 router
对象上,只会影响特定的路由。它们可以使用 router.use()
方法来添加。
比如:
-- -------------------- ---- ------- ----- ------ - ---------------- ---------------- ---- ----- -- - -------------------- ------ -- -------------------- ----- ---- -- - ---------------- --
错误处理中间件
错误处理中间件可以捕获路由或中间件函数中抛出的异常,并且返回错误信息给客户端。错误处理中间件需要一个额外的参数,比如:
app.use((err, req, res, next) => { console.error(err.stack) res.status(500).send('出错了') })
第三方中间件
除了自己编写中间件之外,还可以使用许多第三方中间件,比如:
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