类似于express.urlencoded
定义中间件——>监听req(客户端请求的请求体)的data事件——>监听req.end事件(表示数据已经发送完毕——>使用node内置的querystring模块解析请求体数据——>将解析出来的数据对象挂载为req.body——>将自定义中间件进行封装
req.date是客户端发送给服务器的数据,如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后,分批发送到服务器,所以data事件可能会触发多次,每一次触发data事件,获取到的数据只是完整数据的一部分,需要对收到的数据进行拼接,将所有数据拼接完成后才是最终发送的数据——————req.on方法监听data事件,触发data事件表示客户端向服务器发送请求体数据,chunk表示完整数据的一部分---对一开始的空数据进行拼接
-
- //这是解析表单数据的中间件
- app.use(function(req,res,next){
- let str=''
- //监听req.data——>保存了客户端发送给服务器的数据
- req.on('date',function(chunk){
- str+=chunk
- })
- })
-------当数据接收完毕会自动触发req的end事件,可以使用req.on拿到end事件,并处理完整的请求体数据——之后就是将字符串格式的数据解析成对象格式 on方法
- req.on('end',function(){
- console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式
- })
- const express=require('express')
- const querystring=require('node:querystring')//由于querystring被弃用了
-
- //创建服务器
- const app=express()
-
- //这是解析表单数据的中间件
- app.use(function(req,res,next){
- let str=''
- //监听req.data——>保存了客户端发送给服务器的数据
- req.on('data',function(chunk){
- str+=chunk
- })
- req.on('end',function(){
- console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
- next()
- })
-
-
- })
- //路由--测试
- app.post('/user',(req,res)=>{
- res.send('wwok')
- })
-
- app.listen(80,()=>{
- console.log('服务器启动成功 127.0.0.1')
- })
querystring,专门用来处理查询字符串,通过这个模块提供的parse()函数,可以把查询的字符串,解析成对象的格式 (把查询的字符串作为传入的参数——导入模块)
- const qs=require('querystring')
- const body=qs.parse(str)
- console.log(body)
由于querystring被弃用了
const querystring=require('node:querystring')//由于querystring被弃用了
- const express=require('express')
- const querystring=require('node:querystring')//由于querystring被弃用了
-
- //创建服务器
- const app=express()
-
- //这是解析表单数据的中间件
- app.use(function(req,res,next){
- let str=''
- //监听req.data——>保存了客户端发送给服务器的数据
- req.on('data',function(chunk){
- str+=chunk
- })
- req.on('end',function(){
- console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
- const body=querystring.parse(str)
- console.log(body)
- next()
-
- })
-
- 、
- })
- //路由--测试
- app.post('/user',(req,res)=>{
- res.send('wwok')
- })
-
- app.listen(80,()=>{
- console.log('服务器启动成功 127.0.0.1')
- })

上游的中间件和下游的中间件和路由之间共享一份req,res。所以我们可以将解析出来的数据,挂载为req的自定义属性,命名req.body,提供给下游使用 req.body=body;//进行挂载
- const express=require('express')
- const querystring=require('node:querystring')//由于querystring被弃用了
-
- //创建服务器
- const app=express()
-
- //这是解析表单数据的中间件
- app.use(function(req,res,next){
- let str=''
- //监听req.data——>保存了客户端发送给服务器的数据
- req.on('data',function(chunk){
- str+=chunk
- })
- req.on('end',function(){
- // console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
- const body=querystring.parse(str)
- console.log(body)
- req.body=body;//进行挂载
- next()//跳转去下一个中间件或者路由
- })
- })
- //路由--测试
- app.post('/user',(req,res)=>{
- res.send(req.body)
- })
-
- app.listen(80,()=>{
- console.log('服务器启动成功 127.0.0.1')
- })
封装:
-
- const querystring=require('node:querystring')//由于querystring被弃用了
-
- //创建服务器
-
- //这是解析表单数据的中间件
- const bodyParser=function(req,res,next){
-
- let str=''
- //监听req.data——>保存了客户端发送给服务器的数据
- req.on('data',function(chunk){
- str+=chunk
- })
- req.on('end',function(){
- console.log(str)//打印一下发送的请求体数据--代表数据接收完毕----之后需要做的就是将字符串格式的数据解析成对象格式-------测试
- const body=querystring.parse(str)
- console.log(body)
- req.body=body;//进行挂载
- next()
- })
-
- }
-
- module.exports= bodyParser
导出:
- const express=require('express')
- const a=require('./自定义中间件封装')
-
- //创建服务器
- const app=express()
-
- //将自定义的中间件注册为全局可用的中间件
- app.use(a)
- //路由--测试
- app.post('/user',(req,res)=>{
-
- res.send(req.body)
- })
-
- app.listen(80,()=>{
- console.log('服务器启动成功 127.0.0.1')
- })