Express 中间件----body-parser(五)

作者: simuty | 来源:发表于2016-11-19 11:19 被阅读5607次
    body-parser是什么?

    body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体,Express框架中就是使用这个模块做为请求体解析中间件。

    body-parser 与 原生解析对比

    Node.js 原生HTTP模块中,是将用户请求数据封装到了用于请求对象req中,该对象是一个IncomingMessage,该对象同时也是一个可读流对象。

    var http = require('http');
    //用http模块创建一个http服务端 
    http.createServer(function(req, res) {
    req.on('data', function(chunk){
    ....
    });
    req.on('end', function(){
    ....
    //在此对不同类型进行判断
    }).listen(3000);;
    

    body-parser模块是一个Express中间件,它使用非常简单且功能强大,接下来进入干货阶段.

    第二部分 body-parser

    2.1 下载配置

    $ npm install body-parser
    

    2.2 基本使用

    var express = require('express')
    //获取模块
    var bodyParser = require('body-parser')
    
    var app = express()
    
    // 创建 application/json 解析
    var jsonParser = bodyParser.json()
    
    // 创建 application/x-www-form-urlencoded 解析
    var urlencodedParser = bodyParser.urlencoded({ extended: false })
    
    // POST /login 获取 URL编码的请求体
    app.post('/login', urlencodedParser, function (req, res) {
      if (!req.body) return res.sendStatus(400)
      res.send('welcome, ' + req.body.username)
    })
    
    // POST /api/users 获取 JSON 编码的请求体
    app.post('/api/users', jsonParser, function (req, res) {
      if (!req.body) return res.sendStatus(400)
      // create user in req.body
    });
    app.listen(3000);
    
    

    2.3 API

    对请求体的四种解析方式:

    1. bodyParser.json(options): 解析json数据
    2. bodyParser.raw(options): 解析二进制格式(Buffer流数据)
    3. bodyParser.text(options): 解析文本数据
    4. bodyParser.urlencoded(options): 解析UTF-8的编码的数据。
    

    2.3.1 bodyParser 解析json数据

    var bodyParser = require('body-parser')
    

    bodyParser变量是对中间件的引用。请求体解析后,解析值都会被放到req.body属性,内容为空时是一个{}空对象。

    2.3.2 bodyParser.json(options) :返回一个仅解析json格式数据的中间件。

    option可选对象:

    1. inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true。
    2. limit - 设置请求的最大数据量。默认为'100kb'
    3. reviver - 传递给JSON.parse()方法的第二个参数,详见JSON.parse()
    4. strict - 设置为true时,仅会解析Array和Object两种格式;设置为false会解析所有JSON.parse支持的格式。默认为true
    5. type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/json。
    6. verify - 这个选项仅在verify(req, res, buf, encoding)时受支持
    

    2.3.3 bodyParser.raw(options)

    返回一个将所有数据做为Buffer格式处理的中间件.其后的所有的req.body中将会是一个Buffer值。

    option可选值:

    1. inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true。
    2. limit - 设置请求的最大数据量。默认为'100kb'
    3. type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/octet-stream。
    4. verify - 这个选项仅在verify(req, res, buf, encoding)时受支持
    

    2.3.4 bodyParser.text(options) 解析文本格式

    返回一个仅处理字符串格式处理的中间件。其后的所有的req.body中将会是一个字符串值。

    1. defaultCharset - 如果Content-Type后没有指定编码时,使用此编码。默认为'utf-8'
    2. inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true。
    3. limit - 设置请求的最大数据量。默认为'100kb'
    4. type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/octet-stream。
    5. verify - 这个选项仅在verify(req, res, buf, encoding)时受支持
    

    2.3. 5 bodyParser.urlencoded(options) 解析UTF-8的编码的数据。
    返回一个处理urlencoded数据的中间件。

    option可选值

    1. extended - 当设置为false时,会使用querystring库解析URL编码的数据;当设置为true时,会使用qs库解析URL编码的数据。后没有指定编码时,使用此编码。默认为true
    2. inflate - 设置为true时,deflate压缩数据会被解压缩;设置为true时,deflate压缩数据会被拒绝。默认为true。
    3. limit - 设置请求的最大数据量。默认为'100kb'
    4. parameterLimit - 用于设置URL编码值的最大数据。默认为1000
    5. type - 该选项用于设置为指定MIME类型的数据使用当前解析中间件。这个选项可以是一个函数或是字符串,当是字符串是会使用type-is来查找MIMI类型;当为函数是,中间件会通过fn(req)来获取实际值。默认为application/octet-stream。
    6. verify - 这个选项仅在verify(req, res, buf, encoding)时受支持
    

    代码示例:

    var express = require('express')
    var bodyParser = require('body-parser')
    var app = express()
    
    // create application/json parser
    var jsonParser = bodyParser.json()
    // create application/x-www-form-urlencoded parser
    var urlencodedParser = bodyParser.urlencoded({ extended: false })
    
    // POST /home 获取 urlencoded bodies
    app.post('/home', urlencodedParser, function (req, res) {
      if (!req.body) return res.sendStatus(400)
      res.send('welcome, ' + req.body.username)
    })
    
    // POST /api/users 获取 JSON bodies
    app.post('/about', jsonParser, function (req, res) {
      if (!req.body) return res.sendStatus(400)
      res.send('welcome ****, ' + req.body.username)
    });
    
    app.listen(3000);
    
    
    屏幕快照 2016-11-17 下午6.06.21.png 屏幕快照 2016-11-17 下午6.07.03.png

    第三部分 POST相关内容

    HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行请求头消息主体。HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。

    协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。
    POST 提交数据时,包含了 Content-Type消息主体编码方式两部分。因为服务器端通常会依据Content-Type来决定使用何种方式解析主体部分.

    四种方式:

    1. application/x-www-form-urlencoded:提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。
    2. multipart/form-data:使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data
    3. application/json: 用来告诉服务端消息主体是序列化后的 JSON 字符串。
    4. text/xml: 它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。
    

    其中application/x-www-form-urlencoded编码其实是基于uri的percent-encoding编码的,所以采用application/x-www-form-urlencoded的POST数据和queryString只是形式不同,本质都是传递参数。

    参考
    github====body-parser
    关于application/x-www-form-urlencoded编码
    四种常见的 POST 提交数据方式
    stackoverflow

    更多精彩内容请关注“IT实战联盟”哦~~~


    IT实战联盟.jpg

    相关文章

      网友评论

      • 快减肥成功的胖纸:"POST 提交数据时,包含了 Content-Type 和消息主体编码方式两部分。"中的"消息文体编码方式"是不是应该是"消息主体"。
        Content-type不就是消息主体编码方式么?
      • Evtion:楼主那个2.3.2哪里是不是写错了??
        simuty:@LaternKiwis Thank you, 这样应该就不会有异议的啦 :smile:

      本文标题:Express 中间件----body-parser(五)

      本文链接:https://www.haomeiwen.com/subject/fmlrpttx.html