12.中间件
一.概念
http请求中的过滤层(http请求交给方法处理前,先交给另一个方法过滤)。
- 中间件是在获取请求和发送响应之间在服务器上运行的代码
- 应用场景:判断登录状态,检测RBSAC权限,错误捕获等
- 中间件代码从上往下执行
二.next方法
- 可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。调用next方法" next()"将请求的控制权交给下一个中间件,直到遇到结束请求的中间件。
//app.use('/')中的'/'表示请求时请求的初始中间件,写在最上面
app.use('/',(req,res,next)=>{
next() //会进入下一个中间件app.get()
})
app.get('/', (req, res) => {
fs.readFile('./views/index.html', 'utf8', (err, data) => {
if (err) {
res.send(err)
} else {
res.send(data) //遇到结束请求的中间件停止
}
})
})
- 可以在next()方法中传入一个参数err,即next(err)。next传递err则匹配第一个含有err的中间件.(可以在fs渲染html页面时使用)
app.use('/',(req,res,next)=>{
fs.readFile('./views/index.html', 'utf8', (err, data) => {
if (err) {
next(err) //会进入含有err的中间件
} else {
res.send(data) //遇到结束请求的中间件停止
}
})
})
app.use((err,req, res, next) => {
res.status(404).send("404页面")
// //html页面
// fs.readFile("./views/404.html",'utf8', (err, data) => {
// if (err) {
// res.send(err)
// }else{
// res.status(404).send(data)
// }
// })
})
三.主要作用
中间件就是一堆方法,主要由中间件方法以及请求处理函数组成。可以接收客户端发来的请求、可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。
1. 错误处理中间件
1)自定义404页面(由于中间件从上往下执行,故在代码中要放到最后写)
当找不到地址栏的地址时使用该中间件
app.use((req, res, next) => {
res.status(404).send("404页面")
// //html页面
// fs.readFile("./views/404.html",'utf8', (err, data) => {
// if (err) {
// res.send(err)
// }else{
// res.status(404).send(data)
// }
// })
})
2).错误统一处理(在fs读文件时,在出现err时使用next(err)传入另外一个中间件统一处理)
- 错误处理中间件有 4 个参数,定义错误处理中间件时必须使用这 4 个参数。即使不需要 next 对象,也必须在签名中声明它,否则中间件会被识别为一个常规中间件,不能处理错误。
- 错误处理中间件和其他中间件定义类似,只是要使用 4 个参数,而不是 3 个,其签名如下: (err, req, res, next)。
router.get('/', (req, res,next) => {
fs.readFile('./views/index.html', 'utf8', (err, data) => {
if (err) {
next(err)
// res.send(err)
} else {
res.send(data)
}
})
})
// 错误统一处理
router.use((err,req,res,next)=>{
res.send('网络错误/文件错误')
console.log(err);
})
总结:错误处理的中间件,一个是设置404页面,一个是错误统一处理。
next()next不传参数时:匹配下一个url
next(err)next传递err则匹配含有第一个含有err的中间件
2.内置中间件(配置响应静态文件)
语法:
express.static(root, [options])
//例,简单响应public静态资源方法
app.use(express.static('./public/'))
精心设计的响应静态资源方法(推荐)
var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now());
}
}
app.use(express.static('public', options));

3.常用中间件body-parser的使用
可用于解析post请求体
body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析不同格式的请求体,Express框架中就是使用这个模块做为请求体解析中间件,提供方法如下:
(1). bodyParser.json(options) 解析JSON格式数据
(2). bodyParser.raw(options) 解析二进制格式数据(Buffer流数据)
(3). bodyParser.text(options) 解析文本格式数据
(4). bodyParser.urlencoded(options) 解析UTF-8的编码数据
4.第三方中间件
express内置了很多第三方中间件。
5.应用级中间件
应用级中间件绑定到 app 对象 使用 app.use() 和 app.METHOD(), 其中, METHOD 是需要处理的 HTTP 请求的方法,例如 GET, PUT, POST 等等,全部小写。
6.路由级中间件
路由级中间件和应用级中间件一样,只是它绑定的对象为 express.Router()。
路由级使用 router.use() 或 router.VERB() 加载


浙公网安备 33010602011771号