中间件 ~ body-parser

最近一致在写中间件,这次的目标是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)
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值