Node实战篇:Express 中间件-body-parser(五)

浅殇忆流年 2018-03-27 16:00:09 ⋅ 902 阅读

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时,仅会解析ArrayObject两种格式;设置为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

关注我们

更多精彩内容可以关注“IT实战联盟”公众号,也可以留言和作者互动或者加入我们交流群哦~~~




全部评论: 0

    我有话说:

    Node实战Express 中间 cookie-parser(六)

    cookieParser()实际上是对http传入的cookie进行解析后赋值给req.cookies,使得中间可用

    Node实战Express中间与request(四)

    Express 是一个路由和中间 Web 框架,其自身只具有最低程度的功能:Express 应用程序基本上是一系列中间函数调用。

    Node实战Express路由(三)

    Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。

    Node实战Express-session解析(八)

    Session和HTTP协议属于不同层面的事物,HTTP属于ISO七层模型的最高层应用层,前者Session不属于后者,前者HTTP是具体的动态页面技术来实现的,但同时它又是基于后者的。

    Node实战Express--jade模板引擎(七)

    Jade(Pug) — Node Template Engine,一个高性能的模板引擎,专为 Node 而做......

    Node模块之Events模块()

    Node模块之Events模块()

    Node实战:阶段项目(九)

    项目整体预览 项目的github地址 界面逼格还行-_- 主要功能: 登陆; 退出; 所用的主要模块: express, 路由.静态文件.模块分工等; express-session, 采用

    移动H5前端大性能优化方案(实战

    移动H5前端大性能优化方案(实战

    Node.js 实战--微信支付系列(二)

    接上一首先我们看一下整体上微信小程序的开发流程图

    Node实战Nodejs 链接 Mariadb 实例

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL

    Express系列---路由(二)

    Express 是一个自身功能极简,完全是由路由和中间构成一个的开发框架。

    Node实战:使用joi来验证数据模型 (十)

    Joi 是 hapijs 自带的数据校验模块,他已经高度封装常用的校验功能,本文就是介绍如何优雅地使用 joi 对数据进行校验......

    Node.js 实战--微信支付系列(一)

    真正的无知不是知识的贫乏, 而是拒绝获取知识!——波普尔 (哲学家 思想家)鉴于微信支付文档内容详实

    Node&RabbitMQ系列 保证投递

      网上又很多确保消息100%投递相关的文章,但总的来说还是分为几种情况的 发送端如何确保发送到了交换机 消费端针对不同情况处理消息–后续再说 本文围绕发布者相关内容,目标  发布者消息确认【100%】  ma...

    Node 模块之 util URL queryString path(八)

    第一部分 util util是一个Node.js核心模块,util模块设计的主要目的是为了满足Node内部API的需求。其中包括:格式化字符串、对象的序列化、实现对象继承等常用方法。要使用util

    NodeJS 10.5.0 中的线程:实用介绍

    几天前,Node.js版本10.5.0发布,其中包含的主要功能之一是添加了线程支持。

    Nodejs视频服务器 切片ffmpeg

    Node 视频服务器 切片ffmpeg

    Kafka 慌了!这个中间,要火了?

    你知道吗?在消息中间的编年史上,RocketMQ可谓独当一面。作为Apache 顶级项目(TLP),Apache RocketMQ 是国内首个非 Hadoop 生态体系的顶级项目,开源至今被全球