body-parser Node.js(Express) HTTP请求体解析中间件

2016年06月08日     781     声明

在HTTP请求中,POSTPUTPATCH三种请求方法中包含请求体,Node.js 原生HTTP模块中,请求体要基于流的方式接收和解析。body-parser是一个HTTP请求体解析中间件,使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体,Express框架中就是使用这个模块做为请求体解析中间件。

  1. 请求体解析

  2. 请求体解析

1. 请求体解析

1.1 原生环境中的解析

Node.js 原生HTTP模块中,是将用户请求数据封装到了用于请求对象req中,该对象是一个IncomingMessage,该对象同时也是一个可读流对象。在原生HTTP服务器,或不依赖第三方解析模块时,可以像下面这样接收并解析请求体:

const http = require('http');

//用http模块创建一个http服务端
http.createServer(function(req, res) {
if (req.method.toLowerCase() === 'post') {
var body = '';
req.on('data', function(chunk){
body += chunk;
}); req.on('end', function(){
if(req.headers['content-type'].indexOf('application/json')!==-1){
// JSON 格式请求体解析
JSON.parse(body);
} else if(req.headers['content-type'].indexOf('application/octet-stream')!==-1){
// Raw 格式请求体解析
// ……
} else if(req.headers['content-type'].indexOf('text/plain')!==-1){
// text 文本格式请求体解析
// ……
} else if(req.headers['content-type'].indexOf('application/x-www-form-urlencoded')!==-1){
// URL-encoded 格式请求体解析
// ……
} else {
// 其它格式解析
}
})
} else {
res.end('其它提交方式');
}
}).listen(3000);

1.2 使用body-parser解析请求体

body-parser模块是一个Express/Connect中间件,它使用非常简单且功能强大,可以像下面这样用这个模块解析请求体:

Express/Connect 项层处理

Express框架默认使用body-parser做为请求体解析中间件,创建Express项目后,可以在app.js文件中看到如下代码:

/* 引入依赖项 */
var express = require('express');
// ……
var bodyParser = require('body-parser'); var routes = require('./routes/index');
var users = require('./routes/users'); var app = express(); // …… // 解析 application/json
app.use(bodyParser.json());
// 解析 application/x-www-form-urlencoded
app.use(bodyParser.urlencoded());

这样就在项目的Application级别,引入了body-parser模块处理请求体。在上述代码中,模块会处理application/x-www-form-urlencodedapplication/json两种内容格式的请求体。经过这个中间件处理后,就可以在所有路由处理器的req.body中访问请求参数。

解析Express具体路由

在实际应用中,不同路径(路由)可能会要求用户使用不同的内容类型,body-parser还支持为单个Express路由添加请求体解析:

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

指定请求类型

body-parser还支持为某一种或一类内容类型的请求体指定解析方式,指定时可以通过在解析方法中添加type参数修改指定Content-Type的解析方式。

如,可以对text/plain内容类型使用JSON解析:

app.use(bodyParser.json({ type: 'text/plain' }))

这一选项更多是用在非标准请求头的解析中,如下:

// 解析自定义的 JSON
app.use(bodyParser.json({ type: 'application/*+json' })) // 解析自定义的 Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' })) // 将 HTML 请求体做为字符串处理
app.use(bodyParser.text({ type: 'text/html' }))

2. body-parser模块的API

通过npm install body-parser命令安装模块后,可以通过以下方式获取模块引用:

var bodyParser = require('body-parser')

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

2.1 bodyParser.json() - 解析JSON格式

bodyParser.json(options)

返回一个仅解析json格式数据的中间件。这个方法支持任意Unicode编码的请求体,且支持gzipdeflate编码的数据压缩。

Option是一个包含以下可选值的对象

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

2.2 bodyParser.raw() - 解析二进制格式

bodyParser.raw(options)

返回一个将所有数据做为Buffer格式处理的中间件。这个方法支持gzipdeflate编码的数据压缩。解析后,其后的所有的req.body中将会是一个Buffer数据。

Option是一个包含以下可选值的对象

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

2.3 bodyParser.text() - 解析文本格式

bodyParser.text(options)

返回一个仅处理字符串格式处理的中间件。这个方法支持gzipdeflate编码的数据压缩。解析后,其后的所有的req.body中将会是一个字符串值。

Option是一个包含以下可选值的对象

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

2.4 bodyParser.urlencoded() - 解析文本格式

bodyParser.urlencoded(options)

返回一个处理urlencoded数据的中间件。这个方法默认使用UTF-8编码,且支持gzipdeflate编码的数据压缩。解析后,其后的所有的req.body中将会是一个键值对对象。

Option是一个包含以下可选值的对象

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

body-parser Node.js(Express) HTTP请求体解析中间件的更多相关文章

  1. Node.js + Express 接口请求(GET、POST、PUT)事例

    路由 路由是指应用程序的端点(URI)如何响应客户端请求.有关路由的介绍,请参阅基本路由. 您可以使用Express app对象的方法定义路由,这些方法对应于HTTP方法; 例如,app.get()处 ...

  2. body-parser 是一个Http请求体解析中间件

    1.这个模块提供以下解析器 (1) JSON body parser (2) Raw body parser (3)Text body parser (4)URL-encoded form body ...

  3. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

  4. node.js+express+mongoose实现用户增删查改案例

    node.js+express+mongodb对用户进行增删查改 一.用到的相关技术 使用 Node.js 的 express 框架搭建web服务 使用 express 中间件 body-parse ...

  5. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

  6. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  7. Node.js GET/POST请求

    在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般都使用GET/POST请求. 我将为大家介绍 Node.js GET/POST请求. 获取GET请求内容 由于G ...

  8. Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

    目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...

  9. Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识

    前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ...

随机推荐

  1. JS模板引擎handlebars.js的简单使用

    handlebars.js的使用 首先我们要明白handlebars.js是干什么用的,我们知道使用jsp很麻烦, 于是我们开始使用freemarker等模板引擎,但这个只是针对服务器端来解 析的,那 ...

  2. Java编程思想 学习笔记3

    三.操作符 1.优先级 当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的计算顺序.程序员常常忘记其他优先级规则,所以应该用括号明确规定计算顺序. 当编译器观察到一个String后面紧跟着 ...

  3. 05-迪米特法则(LOD 又名: 最少知道原则)

    1. 背景      类与类之间的关系越密切,耦合度越大,当一个类发生变化时,对另一个类的影响也越大. 2. 定义     一个类应该对其它类保持最少的了解. 3. 解决方法      尽量降低类与类 ...

  4. location对象的一些属性和方法

    window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面 以下是window.location的属性 window.location.host 返回主机名或者 ...

  5. MySQL锁解决并发问题详解

    文章分为以下几个要点 问题描述以及解决过程 MySQL锁机制 数据库加锁分析 下面讨论的都是基于MySQL的InnoDB. 0. 问题描述以及解决过程 因为涉及到公司利益问题,所以下面很多代码和数据库 ...

  6. 集大软件工程15级个人作业Week1

    集大软件工程15级个人作业Week1 孙志威 201521123077 博客园主页 码云地址 阅读参考材料,并回答下面几个问题 (1)回想一下你初入大学时对网络工程专业的畅想 当初你是如何做出选择网络 ...

  7. android 简单的读写联系人

    一.读取联系人 (1).从raw_contact表读 contact_id (2).从data表中读取data1 (3).从mimetypes读取mimetype 1.AndroidManifest. ...

  8. Nginx GZIP 压缩

    [ HTTP 开启gzip ] gzip on; // 开启 nginx在线实时压缩数据流: gzip_min_length 1k; // 允许压缩的页面最小字节 gzip_buffers 32k; ...

  9. python的安装和pycharm的安装

    下载地址   官网:https://www.python.org/downloads/release/python-372/ Window 平台安装 Python: Add python xx to ...

  10. Git查看单个文件修改历史

    1 命令 git log --pretty=oneline  文件名 ➜ admin git:(feature/v1.5.0_20181202_group) git log --pretty=onel ...