Express学习(三)

Express中间件

中间件的概念

  • 什么是中间件
    中间件,特指业务流程的中间处理环节。
  • Express中间件的调用流程
    当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。类似于下图所示
  • Express中间件的格式
    Express的中间件本质上就是一个function处理函数,Express中间件的格式如下:
var express = require('express')
var app = express()app.get('/', function(req, res, next){
next()
})
app.listen(3000)

注意:中间件函数的形参列表中必须包含next参数,而路由处理函数中只包含req和res。

  • next函数的作用
    next函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。

Express中间件的使用

  • 定义中间件函数
    可以通过如下的方式,定义一个最简单的中间件函数:
//常量new所指向的就是一个中间件函数
const mw = function(req, res, next) {console.log('这是一个最简单的中间件函数')//注意:在当前中间件的业务处理完毕后,必须调用next()函数//表示把流转关系转交给下一个中间件或路由next()
}
  • 全局生效的中间件
    客户端发起的任何请求,到达服务器之后都会触发的中间件,叫做全局生效的中间件。通过调用app.use(中间件函数),即可定义一个全局生效的中间件,示例代码如下:
const mw = function(req, res, next) {console.log('这是一个最简单的中间件函数')//注意:在当前中间件的业务处理完毕后,必须调用next()函数//表示把流转关系转交给下一个中间件或路由next()
}//全局生效的中间件
app.use(mw)
  • 示例如下
    当我们启动该服务器,并打开相应网址我们可以发现在终端中打印如下字样,表示我们是先经过中间件处理,然后响应的get请求,类似于我们之间画的图在这里插入图片描述
  • 定义全局中间件的简化形式
    就稍微修改一下上面的代码即可
app.use(function (req, res, next) {
console.log('这是一个简单的中间件函数')
next()
])
  • 中间件的作用
    多个中间件之间共享同一份req和res。基于这样的特性,我们可以在上游的中间件中,统一为req和res对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
    示例:

  • 定义多个全局中间件
    可以使用app.use()连续定义多个全局中间件。客户端请求到达服务器之后会按照中间件定义的先后顺序依次进行调用,如下:
    在这里插入图片描述
  • 局部生效的中间件
    不使用app.use()定义的中间件就叫做局部生效的中间件,示例如下:在这里插入图片描述
    在这里插入图片描述
    下面是不使用中间件的路由
    在这里插入图片描述
    在这里插入图片描述
  • 定义多个局部中间件
    可以在路由中通过以下两种完全等价的方式使用多个局部中间件:
app.get('/', mw1, mw2, (req,  res) => { res.send('Home page.') })
app.get('/', [mw1, mw2], (req,  res) => { res.send('Home page.') })
  • 中间件的5个使用注意事项
    • 一定要在路由之前注册中间件
    • 客户端发送过来的请求可以连续调用多个中间件进行处理
    • 执行完中间件的业务代码之后,不要忘记调用next()函数
    • 为了防止代码逻辑混乱,调用next()函数之后不要再写额外的代码
    • 连续调用多个中间件时,多个中间件之间共享req和res

中间件的分类

  • 应用级别的中间件
    通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做应用级别的中间件,示例如下:
//应用级别的中间件(全局中间件)
app.use((req, res, next) => {
next()
})//应用级别的中间件(局部中间件)
app.get('/', mw, (req, res) => {
res.send('Home page.')
})
  • 路由级别的中间件
    绑定到express.Router()实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别,只不过应用级别的中间件是绑定到app实例上,而路由级别的中间件是绑定到router实例上,示例如下:
const app = express()
const rooter = express.Router()/路由级别的中间件
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})app.use('/', router)
  • 错误级别的中间件
    错误级别的中间件的作用:专门用来捕获整个项目发生的异常错误,从而防止项目异常崩溃的问题
    格式:错误级别中间件的function处理函数中,必须有4个形参,形参从前到后,分别是(err,req,res,next)
app.get('/', function(req, res) {   //路由throw new Error('服务器内部发生了错误')   //在程序中主动触发一个错误,一边在后续的错误处理机制中捕获并处理这个错误res.send("Home page.")
})
app.use(function (err, req, res, next) {  //错误级别的中间件console.log('发生了错误:' + err.message)  //在服务器打印错误消息res.send('Error!' + err.message)   //向客户端相应错误相关的内容
})

注意:错误级别的中间件必须注册在所有路由之后!其他级别的中间件必须在路由之前进行配置

  • Express内置的中间件
    • express.static快速托管静态资源的中间件
    • express.json解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
    • express.urlencoded解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
//配置解析application/json格式数据的内置中间件
app.use(express.json())
//配置解析application/x-www-form-urlencoded格式数据的内置中间件
app.use(express.urlencoded({ extended: false}))

注:在服务器可以使用 req.body这个属性接收客户端发送过来的请求体数据,在默认情况下,如果不配置解析表单数据的中间件,req.body默认等于undefined

  • 第三方的中间件
    非Express官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。
    就像我们之前使用过的一样,例如body-parser这个第三方中间件,使用步骤如下:
    运行npm install body-parser安装中间件
    使用require导入中间件
    调用app.use()注册并使用中间件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/272395.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源】JAVA+Vue.js实现食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

基于MPPT的太阳能光伏电池simulink性能仿真,对比扰动观察法,增量电导法,恒定电压法

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 扰动观察法 (Perturb and Observe Method) 4.2 增量电导法 (Incremental Conductance Method) 4.3 恒定电压法 (Constant Voltage Method) 5.完整工程文件 1.课题概述 在simulink中,实…

黑马点评-异步秒杀实现

异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是…

「蓝桥·算法双周赛」第七场分级赛——小白入门赛

题目列表 说明 好久没打蓝桥杯的比赛&#xff0c;回来试试水&#xff0c;就开了第1、2、3一共三个题&#xff0c;第4题可惜了。1.thanks,mom【算法赛】 思路&#xff1a; 没什么好说的&#xff0c;但是当时比赛刚开始服务器有问题&#xff0c;基本提交的全WA了。#include <…

300分钟吃透分布式缓存-24讲:Redis崩溃后,如何进行数据恢复的?

Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF&#xff0c;以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在需要进行 RDB 持久化时&#xff0c;Redis 会将内存中的所有数据以二进制的格式落地&#xff0c;每…

StarUML6.0.1使用

1. 简介 作为一个软件开发人员&#xff0c;平时免不了做一定的软件设计&#xff0c;标准做法就是采用UML来设计&#xff1a; 讨论功能流程时采用时序图、活动图来表达&#xff1b;做业务功能架构时采用组件图来表达&#xff1b;做系统部署架构时采用部署图来表达&#xff1b;做…

linux 日志轮转

前言: 在Linux系统中&#xff0c;日志轮转是一种重要的管理机制&#xff0c;它可以帮助管理日志文件的大小、数量以及保持系统的性能稳定。通过日志轮转&#xff0c;可以定期对日志文件进行归档、压缩或清理&#xff0c;确保系统的日志记录不会无限增长而占用过多的磁盘空间…

JWT身份验证

在实际项目中一般会使用jwt鉴权方式。 JWT知识点 jwt&#xff0c;全称json web token &#xff0c;JSON Web令牌是一种开放的行业标准RFC 7519方法&#xff0c;用于在两方安全地表示声明。具体网上有许多文章介绍&#xff0c;这里做简单的使用。 1.数据结构 JSON Web Token…

数字人ai直播软件突破AI大模型技术,改变未来科技格局!

数字人AI直播软件在AI大模型技术上的突破&#xff0c;将不可避免地改变未来科技格局。这一突破让人们看到了AI技术的无限可能性&#xff0c;并为未来的科技发展打开了新的大门。 AI大模型技术是近年来人工智能领域的一个热点&#xff0c;它通过构建庞大、复杂的神经网络模型&a…

【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 6 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MAGID: An Automated Pipeline for Generating Synthetic Multi-modal Datasets Authors Hossein Aboutalebi, …

Vue:自动按需导入element-plus图标

自动导入使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 完整vite.config.js参考模板 https://download.csdn.net/download/ruancexiaoming/88928539 导入element-plus图标 命令行安装unplugin-icons pnpm i -D unplugin-icons//没有安装自…

手写简易操作系统(二)--启动计算机

前情提要 在上一部分的内容中&#xff0c;我们已经做好了模拟仿真的整个准备工作&#xff0c;这一节我们就先把计算机启动起来。 一、Bochs配置 1.1、配置启动盘 创建硬盘的工具是bximage&#xff0c;这个工具在我们的Bochs目录下&#xff0c;使用命令行创建硬盘 第一个选择…

详解数据库、Hive以及Hadoop之间的关系

1.数据库&#xff1a; 数据库是一个用于存储和管理数据的系统。数据库管理系统&#xff08;DBMS&#xff09;是用于管理数据库的软件。数据库使用表和字段的结构来组织和存储数据。关系型数据库是最常见的数据库类型&#xff0c;使用SQL&#xff08;Structured Query Language…

登录校验认证

会话技术 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开连接&#xff0c;会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪&#xff1a; 一种维护浏览器状态的方法&#xff0c;服务器需要识别多次请…

【Web】浅聊Java反序列化之Rome——关于其他利用链

目录 前言 JdbcRowSetImpl利用链 BasicDataSource利用链 Hashtable利用链 BadAttributeValueExpException利用链 HotSwappableTargetSource利用链 前文&#xff1a;【Web】浅聊Java反序列化之Rome——EqualsBean&ObjectBean-CSDN博客 前言 Rome中ToStringBean的利用…

186基于matlab的信号盲源分离算法

基于matlab的信号盲源分离算法&#xff0c;包括变步长盲源分离&#xff08;EASI&#xff09;,RLS(自然梯度和普通梯度)&#xff0c;并将三种方法分离结果进行对比。程序已调通&#xff0c;可直接运行。 186 信号盲源分离算法 变步长盲源分离 (xiaohongshu.com)

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(下)

Limo Pro 小车建图导航 引言 前景提要&#xff1a;我们在上文介绍了使用LIMO cobot 实现一个能够执行复杂任务的复合机器人系统的应用场景的项目&#xff0c;从以下三个方面&#xff1a;概念设计、系统架构以及关键组件。 本文主要深入项目内核的主要部分&#xff0c;同样也主要…

使用R语言进行聚类分析

一、样本数据描述 城镇居民人均消费支出水平包括食品、衣着、居住、生活用品及服务、通信、文教娱乐、医疗保健和其他用品及服务支出这八项指标来描述。表中列出了2016年我国分地区的城镇居民的人均消费支出的原始数据&#xff0c;数据来源于2017年的《中国统计年鉴》&#xf…

简单多状态dp问题----删除并获得点数

740. 删除并获得点数 - 力扣&#xff08;LeetCode&#xff09; 本题就是表示不能选值相邻的两个数。 假设nums [ 1,2,3,4,5,6]&#xff0c;那么这其实就类似一个打家劫舍问题&#xff1a; 即选1&#xff0c;就不能选2&#xff0c;只能选3&#xff0c;4&#xff0c;5&#xff…

excel常用操作备忘

目录 快捷键基础数据透视图统计某列的值出现的频数 数据有效性数据分列运算符顺序文本匹配中的通配符错误的类型&#xff08;常与IF嵌套使用&#xff09;函数RANK(num, ref, [order])MID(str, start, len)逻辑函数混合函数选取整列AVERAGEIF(range, criteria, average_range)TR…