应用级中间件
原创
©著作权归作者所有:来自51CTO博客作者wx62aac82759217的原创作品,请联系作者获取转载授权,否则将追究法律责任
中间件:
概念:本质上就是一个函数 包含三个参数:request、response、next
作用:
1.执行任何代码。
2.修改请求和响应对象。
3.终结请求-响应对象。
4.调用堆栈中的下一个中间件或路由
分类:
1.应用(全局)级中间件(过滤非法的请求,例如防盗链)
第一种写法:app.use((request,response,next)=>{ })
第二种写法:使用函数定义
2.第三方中间件(通过npm下载的中间件,例如body-parser)
app.use(bodyParser.urlencoded({extebded:true}))
3.内置中间件(express内部封装好的中间件)
app.url(express.urloencoded({extebded:true})))
app.use(express.static('public'))
4.路由器中间件(Router)
备注:
1.在express中,定义路由和中间件的时候,根据定义的顺序(代码的顺序),将定义的每一个中间件或路由,放在一个类似于数组的容器中,当然求过来的时候,依次从容器里取出中间件和路由,进行匹配,如果匹配成功,交由该路由或中间件处理。
2.对于服务器来说,一次请求,只有一个请求对象,和一个响应对象,其它任何的request和response都是对二者的引用
const express = require('express')
const {response, request} = require("express");
const app =express()
app.get('/',(request,response)=>{
response
.send('ok')
})
app.get('/demo',(request,response)=>{
console.log(request.query)
response.send('ok2')
})
// 使用应用级全局中间件0
app.use((reque0st,response,next)=>{
//response.send('我是中间件给你的响应')
//1.过滤一些合法的请求,例如:图片防盗链
// if (合法){
// next()
// }else{
// ewsponse.send('禁止非法请求')
// }
if(request,get('Referer')){
let miniReferer = request.get(Referer).split('/')[2]
if (miniReferer === 'http://localhost:63342'){
next()
}else{
//发生了盗链
response.send(__dirname+'/public/qia.jpg')
}
}else{
next()
}
})
app.listen(3000,function (err){
if (!err) console.log('ok')
// else console.log(err)