最近一致在写中间件,这次的目标是body-parser,哇咔咔, 模块需要安装的哦~
body-parser应用
body-parser 可以帮我们解析请求体,假设写一个请求
client.js
let http = require('http');
let client = http.request({
hostname:'localhost',
port:3000,
path:'/',
method:'post',
headers:{
'Content-Type':'application/x-www-form-urlencode'
}
},function (res) {
});
client.end('name=zdl&age=9');
复制代码
express.js
let express = require('express');
let app = express();
let bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended:true}))
app.post('/',function(req,res){
console.log(req.body);
res.end();
})
app.listen(3000)
复制代码
解析后运行express.js
node client.js
,输出{ name: 'zdl', age: '9' }
body-parser的实现
urlencoded
let express = require('express');
let app = express();
let bodyParser = require('body-parser');
function urlencoded({extended}){
return (req,res,next)=>{
let buffers = [];
req.on('data',function(data){
buffers.push(data);
})
req.on('end',function(){
let str = Buffer.concat(buffers).toString();
if(extended){
req.body = require('querystring').parse(str);
}else{
req.body = require('qs').parse(str);
}
next()
})
}
}
app.use(urlencoded({extended:true}))
app.post('/',function(req,res){
console.log(req.body);
res.end();
})
app.listen(3000)
复制代码
注: querystring不支持嵌套,故而有extended的区分
text
text很简单,但是有点小麻烦,因为假设用户传的是gbk
格式,而 node又不支持这种格式,我们需要用到iconv-lite
库转码(需要安装),
- 首先我们需要将
'Content-Type'
格式转换成'text/plain;charset=gbk'
- 引用
iconv-lite
传输数据 - 安装
content-type
包解析编码格式
'Content-Type':'text/plain;charset=gbk'
}
},function (res) {
});
let iconv = require('iconv-lite');
client.end(iconv.encode('我很帅','gbk'));
复制代码
express.js
function text(){
return (req,res,next)=>{
let buffers = [];
req.on('data',function(data){
buffers.push(data);
})
req.on('end',function(){
let str = Buffer.concat(buffers);
let contentType = require('content-type');
let iconvLite = require('iconv-lite');
let { parameters: { charset }, type} = contentType.parse(req.headers['content-type']);
if(type === 'text/plain'){
// 解码操作
req.body = iconvLite.decode(str, charset);
console.log(req.body);
}
next()
})
}
}
app.use(text())
复制代码
所以整个express.js文件如下
let express = require('express');
let app = express();
let bodyParser = require('body-parser');
function urlencoded({extended}){
return (req,res,next)=>{
let buffers = [];
req.on('data',function(data){
buffers.push(data);
})
req.on('end',function(){
let str = Buffer.concat(buffers).toString();
if(extended){
req.body = require('querystring').parse(str);
}else{
req.body = require('qs').parse(str);
}
next()
})
}
}
app.use(urlencoded({extended:true}))
function text(){
return (req,res,next)=>{
let buffers = [];
req.on('data',function(data){
buffers.push(data);
})
req.on('end',function(){
let str = Buffer.concat(buffers);
let contentType = require('content-type');
let iconvLite = require('iconv-lite');
let { parameters: { charset }, type} = contentType.parse(req.headers['content-type']);
if(type === 'text/plain'){
// 解码操作
req.body = iconvLite.decode(str, charset);
console.log(req.body);
}
next()
})
}
}
app.use(text())
app.post('/',function(req,res){
console.log(req.body);
res.end();
})
app.listen(3000)
复制代码