Express中间件:用于处理请求的,本质就是个函数,类似请求拦截,处理不同请求的拦截
详细看下面代码



const express = require('express');
const app = express();
const fs = require('fs');

// 中间件:处理请求的,本质就是个函数,类似请求拦截 app.all() 所有请求都会进入

/**
* 1、在Express中,对中间件有几种分类
* 不关心请求路劲和请求方法的中间件
* 也就是说任何请求都会进入这个中间件
* 中间件本身是一个方法,该方法接收3个参数
* request 请求对象
* response 响应对象
* next 下一个中间件(中间件可以有多个)
* 2、当一个请求进入一个中间件之后,如果不调用next 则会停留在当前中间件
* 所以next是一个方法,用来调用下一个中间件
* 3、next 方法也是要调用匹配的(不是调用紧挨着的中间件)
*/

app.use(function(req,res,next){
console.log('请求进来了1');
// 执行下一个中间件 ↓
next();
})

app.use(function(req,res,next){
console.log('请求进来了2');
next();
})

// ========================== 举例:第三方插件 body-parse 用于解析post请求 ==================================
// 使用方法 app.use('bodyParse');
app.use(function(req,res,next){
// 判断请求方式为post,解析请求参数,在req上添加属性 body为参数
req.body = {
id:'1'
}
// 调用下一个中间件
next();
})

// 下面展示post请求
app.post('/post',function(req,res,next){
// 这里就可以获取到body-parse 解析的参数了
console.log(req.body);
})

// ========================== 举例:第三方插件 body-parse 用于解析post请求 ==================================

// 以 /xxx 开头的中间件 例如: localhost:5000/a/login (不严格,只判断开头为/a的进入)
app.use('/a',function(req,res,next){
console.log(req.url)
})

// 除了以上中间件之外,还有一种最常用的
// 严格匹配请求方法和请求路径的中间件
// app.get
// app.post

app.get('/',function(req,res,next){
console.log('/');
})

app.post('/a',function(req,res,next){
console.log('/a');
})

// 错误处理
app.get('/aaa',function(req,res,next){
fs.readerFile('/aa/bb/cc',(err,data)=>{
if(err){
// 当我们调用next传入了参数,就会跳过其他中间件直接进入错误处理中间件
next(err);
}
})
})

// 错误处理中间件 错误中间件有4个参数,当调用 next(err) 传入了参数 就会进入错误处理中间件
app.use(function (err, req, res, next) {
console.error(err)
res.status(500).send('Something broke!')
})

// app.get、app.post、express.Router 都是中间件
// 如果没有没有匹配的中间件,则Express 会默认输出:Cannot GET 路径


app.listen(5000,()=>{
console.log('服务启动成功')
})