开启掘金成长之旅!这是我参与「掘金日新计划 · 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)