Express 中间件----body-parser【转载】

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);

复制代码

第三部分 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

转载于:https://juejin.im/post/5c8c61cd5188251d8060ace9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值