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

2020-06-17 05:48:34易采站长站整理

parsePostBody(req, (body) => {
res.end(`Your nick is ${body}`)
});
});

server.listen(3000);

三、处理不同压缩类型

这里举个

gzip
压缩的例子。客户端代码如下,要点如下:

1.压缩类型声明:Content-Encoding赋值为gzip。

2.请求体压缩:通过zlib模块对请求体进行gzip压缩。


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

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

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

// 注意:将 Content-Encoding 设置为 gzip 的同时,发送给服务端的数据也应该先进行gzip
var buff = zlib.gzipSync('chyingp');

client.end(buff);

服务端代码如下,这里通过

zlib
模块,对请求体进行了解压缩操作(guzip)。


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

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

// 关键代码如下
if(contentEncoding === 'gzip') {
stream = zlib.createGunzip();
req.pipe(stream);
}

var arr = [];
var chunks;

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

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

stream.on('error', error => console.error(error.message));
};

var server = http.createServer(function (req, res) {
parsePostBody(req, (chunks) => {
var body = chunks.toString();
res.end(`Your nick is ${body}`)
});
});

server.listen(3000);

写在后面

body-parser
的核心实现并不复杂,翻看源码后你会发现,更多的代码是在处理异常跟边界。

另外,对于POST请求,还有一个非常常见的

Content-Type
multipart/form-data
,这个的处理相对复杂些,
body-parser
不打算对其进行支持。篇幅有限,后续章节再继续展开。