Express中间件

78 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

中间件的分类

  • 应用级别的中间件
  • 路由级别的中间件
  • 错误级别的中间件
  • Express内置的中间件
  • 第三方中间件

路由级别中间件

通过路由引入的中间件叫路由级别中间件

const express = require('express')
const router = express.Router()

router.use(function(req,res,next){
console.log('time',Date.now())
next()
})

module.exports = router

错误级别的中间件

错误级别中间件的作用: 专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题 格式: 错误级别的中间件function处理函数中,必须包含四个形参,形参顺序从前到后,分别是(err,req,res,next) 注意: 错误级别的中间件必须写在所有路由之后

app.get('/',(req,res)=>{
throw new Error ('服务器内部发生了错误') // 人为抛出一个错误
res.send('home page')
})
// 发现一个错误之后,会捕捉到这个错误
app.use((err,req,res,next)=>{
console.log('发生了错误'+ err)
res.send('Error:'+err)
})

Express 内置的中间件

  • express.static 快速托管静态资源的中间件
  • express.json解析JSON格式的请求体数据(==有兼容性== ,只能在4.16.0版本之后才能使用)
const express = require('express')
const app = express()
// 除了错误级中间件,其他的中间件,必须在路由之前进行配置
//通过express.json()这个中间件,解析表单中的JSON格式的数据
app.use(express.json())
//发送post请求
app.post('/user', (req, res) => {
//在服务器上可以通过req.body这个属性,来接受客户端发送过来的请求体的数据
//默认情况下,如果不配置解析表单数据的中间件,则req.body返回的值为undefind
    console.log(req.body)
    res.send(req.body)
})
app.listen(80, () => {
    console.log('http://127.0.0.1')
})
  • express.unlencoded解析URL-encoded格式的请求体数据(==有兼容性== ,只能在4.16.0版本之后才能使用)
app.use(express.urlencoded({extended:false}))
const express = require('express')
const app = express()
app.use(express.json())
//通过exoress.urlencoded()这个中间件,来解析url-encoded格式的数据
app.use(express.urlencoded({ extended: false }))
app.post('/user', (req, res) => {
    console.log(req.body)//如果是get请求则是req.query
    res.send(req.body)
})
app.listen(80, () => {
    console.log('http://127.0.0.1')
})

第三方中间件

通过nmp下载

const xxx = require('xxx')//通过require导入
app.use()//通过app.use导入

自定义中间件

  • 监听req的data事件 在中间件中,需要监听req对象的data事件,来获取客户端发送到服务器的数据 如果数据过大,无法一次性发送完毕,客户端会把数据切割后,分批发送到服务器。所以data事件可能被多次触发,每次触发得到的数据都只是完整数据的一部分,需要自己手动拼接。
这些是写在中间件里的
```js //定义一个变量来存储客户端发来的数据 let str ='' //监听req对象的data事件(客户端发送过来的新的请求体数据) req.on('data',(chunk)=>{ str+=chunk })

- 监听req的end事件
当请求数据接受完毕后会自动触发req的end事件

```js
req.on('end',()=>{
//str存的是data监听后的完成的数据
console.log(str)
})

使用querystring解析请求数据

node.js内置了一个querystring模块,专门来处理查新字符串。通过这个模块提供的parse()函数,可以轻松查询字符串,解析成对象的格式。

//导入模块
const qs = require('querystring')
//调用qs.parse()方法,吧查询字符串解析为对象
const body - qs.parse(sr)