Nodejs中Express 常用中间件 body-parser 实现解析

2020-06-17 05:48:34易采站长站整理
的解析差不多,就多了个
querystring.parse()
的调用。


var http = require('http');
var querystring = require('querystring');

var parsePostBody = function (req, done) {
var length = req.headers['content-length'] - 0;
var arr = [];
var chunks;

req.on('data', buff => {
arr.push(buff);
});

req.on('end', () => {
chunks = Buffer.concat(arr);
done(chunks);
});
};

var server = http.createServer(function (req, res) {
parsePostBody(req, (chunks) => {
var body = querystring.parse( chunks.toString() ); // 关键代码
res.end(`Your nick is ${body.nick}`)
});
});

server.listen(3000);

二、处理不同编码

很多时候,来自客户端的请求,采用的不一定是默认的

utf8
编码,这个时候,就需要对请求体进行解码处理。

客户端请求如下,有两个要点。

1.编码声明:在Content-Type最后加上;charset=gbk

2.请求体编码:这里借助了iconv-lite,对请求体进行编码iconv.encode(‘程序猿小卡’, encoding)


var http = require('http');
var iconv = require('iconv-lite');

var encoding = 'gbk'; // 请求编码

var options = {
hostname: '127.0.0.1',
port: '3000',
path: '/test',
method: 'POST',
headers: {
'Content-Type': 'text/plain; charset=' + encoding,
'Content-Encoding': 'identity',
}
};

// 备注:nodejs本身不支持gbk编码,所以请求发送前,需要先进行编码
var buff = iconv.encode('程序猿小卡', encoding);

var client = http.request(options, (res) => {
res.pipe(process.stdout);
});

client.end(buff, encoding);

服务端代码如下,这里多了两个步骤:编码判断、解码操作。首先通过

Content-Type
获取编码类型
gbk
,然后通过
iconv-lite
进行反向解码操作。


var http = require('http');
var contentType = require('content-type');
var iconv = require('iconv-lite');

var parsePostBody = function (req, done) {
var obj = contentType.parse(req.headers['content-type']);
var charset = obj.parameters.charset; // 编码判断:这里获取到的值是 'gbk'

var arr = [];
var chunks;

req.on('data', buff => {
arr.push(buff);
});

req.on('end', () => {
chunks = Buffer.concat(arr);
var body = iconv.decode(chunks, charset); // 解码操作
done(body);
});
};

var server = http.createServer(function (req, res) {