body-parser一般用来对req.body进行解析;
中间件:https://github.com/expressjs/body-parser
body-parser解析https://www.cnblogs.com/chyingp/p/nodejs-learning-express-body-parser.html
http://blog.csdn.net/yanyang1116/article/details/54847560
POST请求的报文,如下所示。
POST /test HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: text/plain; charset=utf8
Content-Encoding: gzip
chyingp
其中需要我们注意的有Content-Type
、Content-Encoding
以及报文主体:
Content-Type:请求报文主体的类型、编码。常见的类型有
text/plain
、application/json
、application/x-www-form-urlencoded
。常见的编码有utf8
、gbk
等。Content-Encoding:声明报文主体的压缩格式,常见的取值有
gzip
、deflate
、identity
。报文主体:这里是个普通的文本字符串
chyingp
。
body-parser主要做了什么
body-parser
实现的要点如下:
处理不同类型的请求体:比如
text
、json
、urlencoded
等,对应的报文主体的格式不同。处理不同的编码:比如
utf8
、gbk
等。处理不同的压缩类型:比如
gzip
、deflare
等。其他边界、异常的处理。
一、处理不同类型请求体
为了方便读者测试,以下例子均包含服务端、客户端代码,完整代码可在笔者github上找到。
解析text/plain
客户端请求的代码如下,采用默认编码,不对请求体进行压缩。请求体类型为text/plain
。
var http = require('http');
var options = {
hostname: '127.0.0.1',
port: '3000',
path: '/test',
method: 'POST',
headers: {
'Content-Type': 'text/plain',
'Content-Encoding': 'identity'
}
};
var client = http.request(options, (res) => {
res.pipe(process.stdout);
});
client.end('chyingp');
服务端代码如下。text/plain
类型处理比较简单,就是buffer的拼接。
var http = require('http');
var parsePostBody = function (req, done) {
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 = chunks.toString();
res.end(`Your nick is ${body}`)
});
});
server.listen(3000);
下面四个处理方法分别对body的内容采用不同的处理方法;分别是处理json数据、Buffer流数据、文本数据、UTF-8的编码的数据。
bodyParser.json(options)、bodyParser.raw(options)、bodyParser.text(options)、bodyParser.urlencoded(options)
载入模块:npm install body-parser
各个parser会对req headers及post参数进行一系列的判断和处理,只有满足条件的情况下才对post参数进行解析,解析之前,首先使用raw-body模块对req进行处理,其处理过程是将req作为一个readable stream进行处理,从而得到raw body内容,然后按具体的格式进行解析。
在express项目中,通常顺序调用body-parser所提供的parser,这样当一个parser无法满足post参数解析条件时,还可以使用另一个parser进行解析(在某些特殊的请求中,有可能所有parser均无法解析)
var router = function(app){
// Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。
// 你可以使用 express.static 中间件来设置静态文件路径。例如,如果你将图片, CSS, JavaScript 文件放在 public 目录下,你可以这么写:
// app.use(express.static('public'));
var bodyParser = require('body-parser');//解释参考http://blog.csdn.net/yanyang1116/article/details/54847560
// 创建 application/x-www-form-urlencoded 编码解析
var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded({ extended: false });
// app.use(jsonParser);
app.get('/one', function (req, res) {
res.sendFile( "/Users/wofu/Desktop/node/views" + "/" + "one.html" );
})
app.post('/two', urlencodedParser, function (req, res) {//第二个参数是用一种解析方式解析
// 输出 JSON 格式
var response = {
"first_name":req.body.first_name,
"last_name":req.body.last_name
};
console.log(response);
console.log(req.body);
res.end();
})
};
exports.router = router;