在 Express.js 中,中间件是一种非常有用的机制,可以帮助开发者在请求与响应之间执行代码,并且可以对请求进行处理、转换、验证等操作。正确使用中间件可以提高程序的可读性、可维护性、可测试性,并且还可以有效防止许多攻击。本文将介绍在 Express.js 应用程序中使用中间件的正确方式,内容详细、有深度和学习和指导意义,最后提供了使用示例代码。
概述
Express.js 中的中间件是一组函数,它们可以在请求的生命周期中执行,并且可以访问请求和响应的对象。中间件可以处理请求对象、验证参数、发送响应,并将请求传递给下一个中间件或路由处理程序。Express.js 中的每个中间件都可以执行任何操作,包括修改请求对象、响应对象、添加属性、调用下一个中间件等。
中间件的执行过程在 Express.js 的生命周期中的“执行期”之前,即在请求到达路由处理程序之前或响应发送到客户端之前。中间件函数由app.use()、app.get()、app.post()、app.put()、app.delete()等函数组成,其中app.use()函数是最常用的,因为它可以处理所有类型的HTTP请求。中间件可以是一个函数,也可以是一个函数数组,这样可以同时执行多个函数进行请求处理和响应操作。
使用中间件的技巧
在实际开发中,我们需要正确使用中间件,以下是一些在 Express.js应用程序中使用中间件的技巧:
1. 使用第三方中间件
Express.js 支持大量的第三方中间件,包括处理表单数据、请求日志、验证、压缩、身份验证、CSRF防护等。使用第三方中间件可以节省开发时间,提高代码质量,而不用编写自己的中间件,例如:
-- -------------------- ---- ------- ----- ---------- - ----------------------- ----- ----------- - ----------------------- ----- ------ - ------------------ ----- ------ - ------------------ ----- ---- - ---------------- --------------------------- ----------------------- ------------------ ---------------------------- ----------------
2. 按顺序使用中间件
Express.js 中间件的执行顺序非常重要,因为每个中间件都可以修改请求和响应对象,例如增加、删除和修改属性等。如果中间件不按照正确的顺序使用,可能会导致不正确的处理结果。
通常,需要在路由处理程序之前添加中间件来处理请求对象,例如:验证API密钥、验证授权信息、转换JSON数据、解析查询字符串等。在此之后,在路由处理程序之前添加中间件处理响应对象,例如:缓存控制、CORS策略、错误处理等。示例代码:
-- -------------------- ---- ------- ----- -------------- - ------------------------------ ----- -------------- - ------------------------------ ----- --------------- - ------------------------------- ----- ---------------------- - -------------------------------------- ----- ------ - -------------------- ------------------------ ------------------------ ------------------------- ---------------- --------------------------------
3. 实用可复用中间件
中间件可以是有用的可复用组件,在多个应用程序中使用的中间件可以被抽象为单独的npm模块。例如,可以使用一种日志中间件来记录日志,以避免在多个应用程序中编写相同的日志代码。示例代码:
-- -------------------- ---- ------- -- --------- ----- ------ - ----- ---- ----- -- - ------------------- ---------------------- ------------- ------------- ------- -- -------------- - ------- -- ------ ----- ------ - -------------------------------- ----------------
4. 使用Async函数或Promise来启用异步中间件
中间件可以是异步的,例如:执行文件上传,从数据库查询数据等。在可用时,应使用Async/await函数或Promise返回中间件。这样能更清晰地展示请求执行期间的异步操作,如下所示:
-- -------------------- ---- ------- ----- -------------------- - ----- ----- ---- ----- -- - --- - ----- ---- - --------- -- ------- ----- --- ----------- ---------- -- --- ---- ----------- - -------------------------------------- ------- - ----- ----- - ---------- - -- ------------------- ---------------------- --------------------- ----- ---- -- - ---------------------- ---- ----------- --- ---
5. 使用中间件传递数据
为了在中间件之间共享数据,需要使用res.locals对象。res.locals作为中间件之间传递数据的容器,它是一个Javascript对象,可以设置任何属性。在后续的中间件或路由处理程序中调用req.app.locals可以访问应用程序配置信息、中间件参数、共享数据等。示例代码:
-- -------------------- ---- ------- ----- -------------- - ----- ----- ---- ----- -- - ----- ---- - ----- --------------------------------------------------- -- ------ - --------------- - ----- ------- - ---- - -------- ----------------------- - -- ---------------- --------------- ----- ---- -- - ----- ---- - ---------------- --------------------------- ---
总结
中间件是Express.js的强大机制,它提供了许多有用和可重用的功能,在请求和响应之间执行代码,可以修改请求对象、响应对象或调用下一个中间件或路由处理程序。在实践中,需要按正确的顺序使用中间件、使用可重用的中间件、使用异步的中间件、使用第三方中间件和共享数据。以上是在Express.js中使用中间件的正确方式,希望读者可以根据文章提供的内容在实际项目中正确地使用中间件。
示例代码
以下是一个示例代码,展示了如何在Express.js中使用各种类型的中间件:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ----------- - ----------------------- ----- ------ - ------------------ ----- ------ - ------------------ ----- ---- - ---------------- ----- -------------- - ----- ----- ---- ----- -- - ----- ---- - ----- --------------------------------------------------- -- ------ - --------------- - ----- ------- - ---- - -------- ----------------------- - -- ----- -------------- - ------------------ ----- --------------- - ----- ---- ----- -- - ------------------------------ -------------- ------------------ ------- -- ----- ---------------------- - ----- ---- ---- ----- -- - ------------------- ---------------------- -------- ----------- --- -- ----- ------ - ----- ---- ----- -- - ------------------- ---------------------- ------------- ------------- ------- -- ----- --- - ---------- ------------------ ---------------- ----------------------- ------------------------ ---------------- ------------------------ ------------------------- ------------ ----- ---- -- - ---------------------- -------- ------ ------- --- --- ---------------- ----- ---- -- - ----- ---- - ---------------- --------------------------- --- -------------------------------- ---------------- -- -- - ---------------- --------- -- ---- ---------- ---
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6450e3b0980a9b385b9c45d1