- 一定要在路由之前注册中间件(在后面就,中间件不会生效,直接响应了路由——因为服务器到达请求都是从上到下进行匹配的---)
- 客户端发送的请求,可以连续调用多个中间件,进行处理
- 只要调用next表示此次的业务逻辑结束了,不要再next后面写代码,防止逻辑混乱
- 执行完中间件的代码,不要忘记调用next函数
- 连续调用多个中间件,多个中间件之间,共享req和res
中间件的分类 (Express官方分成5类)
- 应用级别的中间件:通过app.use()或者app.get()或者app.post().绑定到app(服务器)实例上的中间件,叫做应用级别的中间件-通过use,get,post方法绑定到app上
//应用级别的中间件(全局中间件) app.use(function(req,res,next){ console.log('第一个中间件') next() }) //应用级别的中间件(局部局中间件) app.get('/user',mv1,mv2,(req,res)=>{ res.send(' 响应客户端的127.0.0.1/user的get请求 局部中间件会生效') }) //应用级别的中间件(局部局中间件) app.post('/user',mv1,mv2,(req,res)=>{ res.send(' 响应客户端的127.0.0.1/user的get请求 局部中间件会生效') })
- 路由级别的中间件:绑定到express.Router()实例上,叫做路由级别的中间件。它的用法和应用级别的中间件没人任何区别。只不过,应用级别的中间件是绑定到app实例上,路由级别的中间件是绑定到router实例上
//导入express const express=require('express') //创建路由对象 const router=express.Router() //路由级别中间件 router.use(function(req,res,next){ console.log('中间件') next() }) //挂载路由模块 app.use('/',router)
- 错误级别的中间件:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问提格式:错误级别中间件的function处理函数中,必须有4个形参,形参顺序从前到后分别为(err,req,res,next)————————————错误级别中间件必须注册在所有路由之后
//导入express模块 const express=require('express') //创建web服务器 const app=express() //挂载路由 app.get('/',(req,res)=>{//监听get请求 throw new Error('服务器内部发生错误') //new认为抛出一个自定义错误-----程序无法执行就 res.send('处理函数 这是服务器给的 响应客户端的根url的get请求') }) //定义错误级别的中间件 捕获整个项目中的错误 app.use(function(err,req,res,next){ console.log('错误!'+err.message) res.send('Error!'+err.message) }) //启动服务器、使用80端口 app.listen(80,()=>{ console.log('http://127.0.0.1 启动成功') })
- Express官方内置的中间件(express.static快速托管项目中下静态资源,例如HTML文件、图片、CSS样式(无兼容性,任何版本都可以使用)express.json解析json格式的请求数据(有兼容性,在4.16.0+版本可用)express.urlencoded解析URL-encoded格式的请求数据(有兼容性,在4.16.0+版本可用))配置解析application/x-222-form-urlencoded格式数据的内置中间件
app.use(express.static(path.join(__dirname,'../静态资源1')))//这里有一个缺省值 是127.0.0.1 根目录
app.use(express.json())
//配置解析application/x-222-form-urlencoded格式数据的内置中间件
app.use(express.urlencoded({extended:false}))
通过 postman或者其他软件(我使用了postwoman)向服务器发送请求体数据,看服务器是否可以拿到数据,请求体数据放在body面板中进行发送,服务器通过req.body属性接收客户端发送的请求体(表单数据),如果不配置解析表单数据的中间件,则req.body默认等于undefined-------是固定写法
express.json解析json格式的请求数据
const express=require('express')
const app=express()
//其他中间件在路由之前配置解析json数据表单数据的中间件
app.use(express.json())//挂载在req上
//定义一个路由 --在路由中得到请求到服务器的时间
app.post('/user',(req,res)=>{
res.send('服务器响应:OK')
//在服务器中使用
console.log(req.body)//属性去接收客户端的发送来请求体的数据——默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
})
app.listen(80,()=>{
console.log('服务器启动成功:127.0.0.1')
})
express.urlencoded解析URL-encoded格式的请求数据(有兼容性,在4.16.0+版本可用)-键值对)app.use(express.urlencoded({extended:false---不使用第三方解析方式,只是自身的解析方式,如果是true就使用第三方解析}))-客户端提交的请求体数据是什么样子的,服务器端获取解析表单的数据才会是=使得服务器端的req.body有数据-------解析完成会挂载到req.body属性上
const express=require('express')
const app=express()
//其他中间件在路由之前配置解析json数据表单数据的中间件
app.use(express.urlencoded({extended:false}))
//定义一个路由 --在路由中得到请求到服务器的时间
app.post('/c',(req,res)=>{
res.send('服务器响应:OK')
//在服务器中使用
console.log(req.body)//属性去接收客户端的发送来请求体的数据——默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
})
app.listen(80,()=>{
console.log('服务器启动成功:127.0.0.1')
})
- 第三方中间件 不是官方内置的是第三方开发出来的中间件,可以按照需求进行下载配置,在express@1.16.0之前的版本中,经常使用body-parser这个第三方中间件,来解析请求体数据 。使用步骤:运行npm install body-parser (解析表单数据-)安装中间件--与内置中间件很相似)——使用require导入中间件——使用app.use()注册并使用中间件 ----所以注意Express内置的中间件express.urlencoded中间件,就是基于body-parser这个第三方中间件进一步封装起来的
const express=require('express') //创建服务器 const app=express() //导入解析表单数据的中间件 const parser=require('body-parser') //使用app.use注册中间件 app.use(parser.urlencoded({extended:false})) //定义一个路由 app.post('/user',(req,res)=>{ res.send('路由ok') console.log(req.body)//接收数据---默认是undefined--需要进行解析表单数据的接收配置 }) app.listen(80,()=>{ console.log('服务器启动成功 127.0.0.1') })