express插件之body-parser

时间:2021-10-09 10:07:00
body-parser中间件:
  这是node.js的消息体解析中间件,但是这个中间件不会解析multipart body,由于这种消息体很复杂而且也很大。这种multipart的消息体可以用multer,formidable等来完成(mulpipart表示表单的enctype属性)
  这个模块可以提供以下的解析器:
    JSON body parser
Raw body parser
Text body parser
URL-encoded form body parser
  你还可能对一下的消息体解析插件比较有兴趣:
    body
   co-body
var bodyParser = require('body-parser')
所有中间件都会把解析好的消息体封装到req.body上面,如果没有消息体解析那么返回的就是一个空对象{}。当然这个模块也可能抛出异常
bodyParser.json(options)
   返回一个只解析json的中间件,可以支持任何unicode编码的消息体,同时也支持gzip和deflate编码。最后保存的数据都放在req.body对象上
options参数包含以下内容:
   inflate:默认为true。
    limit:消息体的最大值,数字表示最大比特。也可以是string,默认值'100kb'
    reviver:这个选项被直接传入JSON.parse函数,并作为第二个参数。
    strict:如果设置为true,那么只会接受array或者object。false表示接受任何JSON.parse接受的参数
    type:指定这个中间件会解析的媒体类型。可以是一个函数也可以是一个字符串。如果是一个string那么会被传入type-is这个库,并同时可以为
         扩展名如json,或者mime类型(application/json),或者一个包含通配符的mime类型(*/*,*/json)。如果是一个函数,那么这个函数被调用,传入参数
         为fn(req),而且这个req是返回的解析过的真实值。默认为application/json(这里是json方法)
    verify:如果提供了,那么调用时为verify(req,res,buf,encoding),buf表示一个Buffer对象,其中包含的是初始的消息体,也就是没有被解析过的消息体,encoding
           表示这个请求的编码类型,如果抛出异常那么停止解析
bodyParser.raw(options)
  返回一个中间件,这个中间件吧所有的消息解析为一个Buffer,而且支持自动的gzip和defalte编码。解析后,这个Buffer包含的是消息体。
options参数包含以下内容:
inflate:和上面一致
limit:和上面一致

type:如果传入string那么这个string被传入到type-is库,这个string扩展名可以是bin,或者mime类型是application/octet-stream,也可以是通配符(*/*,application/*)。除了默认的返回值为application/octet-stream以外和上面是一致的

verify:和上面一致
bodyParser.text(options)

返回一个中间件,这个中间件可以把消息体解析为一个字符串,而且支持自动的gzip和deflate编码。解析的结果在req.body中
options参数包含以下内容:
defaultCharset:设置一个默认的编码对文本内容进行编码,如果在content-type中没有指定就用这个默认的编码
inflate:和上面一致
limit:和上面一致
type:如果是一个string,那么被传入到type-is的库中,这个string可以是扩展名为txt,或者mime类型为text/plain,或者含有通配符的类型。
     默认为text/plain
verify:和上面一致

bodyParser.urlencoded(options)
 返回一个只解析urlencoded消息体的中间件,只接受utf-8对消息体进行编码,同时支持自动的gzip/deflate编码解析过的消息放在req.body对象中。这个对象包含的键值对,同时值可以是一个string或者一个数组(当extended为false的时候)。也可以是任何类型(当extended设置为true)
options参数包含以下内容:
extended:如果设置为false,那么对URL-encoded的数据的解析采用querystring库,如果设置为true那么采用qs库。 extended符号允许富对象和数组被编码为URL-encoded的类型,也可以是一个JSON编码的数据。默认为true但是还是要仔细研究一下qs和querystring的区别,以便正确的选择
inflate:和上面一致
limit:和上面一致
parameterLimit:指定在URL-encoded的数据中最大的参数的数量,如果参数多于这个数量那么返回给客户端a413,。默认值为1000
type:如果这个参数是string那么会传递给type-is库去判断,扩展名可以是urlencoded,或者mime类型为 application/x-www-form-urlencoded
      或者mime类型为*/x-www-form-urlencoded。默认为application/x-www-form-urlencoded
verify:和上面一致

例子:

var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded 
app.use(bodyParser.urlencoded({ extended: false }))//extended为false表示使用querystring来解析数据,这是URL-encoded解析器
// parse application/json 
app.use(bodyParser.json())//添加json解析器
app.use(function (req, res) {
  res.setHeader('Content-Type', 'text/plain')
  res.write('you posted:\n')
  res.end(JSON.stringify(req.body, null, 2))
})
这个例子演示了添加一个原生的JSON和URL-encoded解析器去解析消息体。
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// create application/json parser 
var jsonParser = bodyParser.json()//获取JSON解析器中间件
// create application/x-www-form-urlencoded parser 
var urlencodedParser = bodyParser.urlencoded({ extended: false })//url-encoded解析器
// POST /login gets urlencoded bodies 
app.post('/login', urlencodedParser, function (req, res) {//注册URL解析器
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})
// POST /api/users gets JSON bodies 
app.post('/api/users', jsonParser, function (req, res) {//使用json中间件获取json数据
  if (!req.body) return res.sendStatus(400)
  // create user in req.body 
})
这个例子演示了如何在需要的路由中添加一个body-parser,这也是express最推荐的使用body-parser的方式
// parse various different custom JSON types as JSON 
app.use(bodyParser.json({ type: 'application/*+json' }))
// parse some custom thing into a Buffer 
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
// parse an HTML body into a string 
app.use(bodyParser.text({ type: 'text/html' }))
所有的中间件可以指定对消息进行解析的编码方式
qs对字符串的处理和 multer可以对 类型是 multipart/form-data的表单进行处理