类似于express.urlencoded
实现过程(6步):
定义中间件——>监听req(客户端请求的请求体)的data事件——>监听req.end事件(表示数据已经发送完毕——>使用node内置的querystring模块解析请求体数据——>将解析出来的数据对象挂载为req.body——>将自定义中间件进行封装
监听req(客户端请求的请求体)的data事件
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的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')
})
使用node内置的querystring模块解析请求体数据
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.body
上游的中间件和下游的中间件和路由之间共享一份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')
})