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)
    //     }
 
    // })
})

三.主要作用

中间件就是一堆方法,主要由中间件方法以及请求处理函数组成。可以接收客户端发来的请求、可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。
image

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));

image

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() 加载

posted @ 2021-12-04 12:48  禾耳  阅读(75)  评论(0)    收藏  举报