Express中间件之body-parser

时间:2022-12-19 00:08:27

中间件body-parser的作用是解析POST请求的请求体。然后我们可以通过req.body,获取到请求参数。
在express4.0之前bodyParser没有从express中剥离开可以通过express.bodyParser引入,但是4.0以后需要单独安装然后通过require(‘body-parser’)引入。
body-parser中提供了四种处理数据的方法:
bodyParser.json(options)//处理json数据,对应的content-type:application/json
bodyParser.raw(options)//处理buffer,数据流对应的content-type:application/vnd.custom-type
bodyParser.text(options)//处理text,文本对应的content-type:text/html
bodyParser.urlencoded(options)//处理UTF-8编码的内容对应的content-type:application/x-www-form-urlencoded
我们常常会看见bodyParser.urlencoded({extended:false})这样的写法,我查阅了一下,其实他的作用就是告诉bodyParser到底是使用querystring
还是QS来处理字符串,
querystring我们在处理GET请求的时候经常用它来格式化请求路径中带来的参数:

var http = require("http");
var querystring = require('querystring');
http.createServer(function(req,res){
var query = querystring.parse(req.query);
})

QS我没用过,他就是一个加强版的querystring,他提供了更多的功能并优化了一些安全性,一般使用querystring就行了,所以一般我们使用{extended:false{}

常见的四种Content-Type:
application/json:json
application/x-www-form-urlencoded:表单
application/form-data:文件
text/html:文本
body-parser常见的使用场景有两种:
第一种,全局使用,
顾名思义就是在全局中有效,对请求进行全局拦截,所有的请求都记性body处理。

var express = require("express");
var app = express();
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({
extended:false,
}));
app.use(bodyParser.json());
app.use("/",function(req,res){
});
...

这里我们use了多种方法,但是这些方法只有一个会匹配成功,就像路由匹配一样,他会去判断header中的content-type是那种类型,然后去匹配对应的处理方法,所以最终执行的方法只有一个,生成一个对应的body。通过阅读源码会发现

req.on("data",function(chunk){

});
req.on("end",function(chunk){

});

他是通过读取req的stream流获取的数据,如果一旦匹配成功,req的流以及被截取,所以其他的也读不到了。

第二种方法是特定路由下使用

var express = require('express')
var bodyParser = require('body-parser')
var app = express()
var jsonParser = bodyParser.json()

var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.post('/login', urlencodedParser, function (req, res) {
if (!req.body) return res.sendStatus(400)
res.send('welcome, ' + req.body.username)
})

app.post('/api/users', jsonParser, function (req, res) {
if (!req.body) {
return res.sendStatus(400)
}

这种方法只有在匹配到具体的路由后才会去处理body中的数据。

在此声明,我善用’通假字’,勿吐槽!