最近一致在写中间件,此次的目标是body-parser,哇咔咔, 模块须要安装的哦~javascript
body-parser 能够帮咱们解析请求体,假设写一个请求java
client.jsnode
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.jsexpress
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' }
app
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的区分post
text很简单,可是有点小麻烦,由于假设用户传的是gbk
格式,而 node又不支持这种格式,咱们须要用到iconv-lite
库转码(须要安装),ui
'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文件以下url
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)
复制代码