body-parser 是 Node.js 正文解析中间件 - 文章教程

body-parser 是 Node.js 正文解析中间件

发布于 2021-08-21 字数 15979 浏览 989 评论 0

在处理程序之前在中间件中解析传入的请求正文,在 req.body 属性下可用。

注意由于req.body的形状基于用户控制的输入,因此该对象中的所有属性和值都是不受信任的,应在信任之前进行验证。例如,req.body.foo.toString()可能以多种方式失败,例如foo属性可能不存在或可能不是字符串,并且toString可能不是函数而是字符串或其他用户输入。

了解 Node.js 中 HTTP 事务的剖析

由于其复杂且通常较大的性质,这不处理多部分实体。对于多部分实体,您可能对以下模块感兴趣:

该模块提供以下解析器:

您可能感兴趣的其他身体解析器:

安装

$ npm install body-parser

应用程序接口

var  bodyParser  =  require ( 'body-parser' )

bodyParser对象公开各种工厂以创建中间件。req.bodyContent-Type请求标头与type选项匹配时,所有中间件都将使用解析的正文填充属性,{}如果没有要解析的正文、Content-Type不匹配或发生错误,则使用空对象 ( )填充。

该模块返回的各种错误在错误部分中进行了描述 。

bodyParser.json([options])

返回仅解析json和仅查看Content-Type标头与type选项匹配的请求的中间件。此解析器接受正文的任何​​ Unicode 编码,并支持自动膨胀gzipdeflate编码。

在中间件之后的对象body上填充包含解析数据的新对象request(即req.body)。

Options

json函数采用一个可选options对象,该对象可能包含以下任何键:

inflate

当设置为 true,则放气(压缩)的物体将被充气;当 false,放气的实体被拒绝。默认为true.

limit

控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果是字符串,则将该值传递给 字节库进行解析。默认为'100kb'.

reviver

reviver选项直接JSON.parse作为第二个参数传递给。您可以在有关 JSON.parse 的 MDN 文档中找到有关此参数的更多信息 。

strict

设置为 时true,将只接受数组和对象;false什么时候接受什么都JSON.parse接受。默认为true.

type

type选项用于确定中间件将解析的媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则type选项直接传递给 type-is 库,这可以是扩展名(如json)、mime 类型(如application/json)或带有通配符的 mime 类型(如*/**/json)。如果是函数,则该type 选项被称为 asfn(req)并且如果它返回一个真值,则请求被解析。默认为application/json.

verify

verify选项(如果提供)称为verify(req, res, buf, encoding),其中bufBuffer原始请求正文的 a 并且encoding是请求的编码。可以通过抛出错误来中止解析。

bodyParser.raw([options])

返回将所有主体解析为 aBuffer并且仅查看Content-Type标头与type选项匹配的请求的中间件。此解析器支持自动膨胀gzipdeflate编码。

在中间件之后的对象body上填充包含解析数据的新对象request(即req.body)。这将是Buffer身体的一个对象。

Options

raw函数采用一个可选options对象,该对象可能包含以下任何键:

inflate

当设置为 true,则放气(压缩)的物体将被充气;当 false,放气的实体被拒绝。默认为true.

limit

控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果是字符串,则将该值传递给 字节库进行解析。默认为'100kb'.

type

type选项用于确定中间件将解析的媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则type选项直接传递给 type-is 库,这可以是扩展名(如json)、mime 类型(如application/json)或带有通配符的 mime 类型(如*/**/json)。如果是函数,则该type 选项被称为 asfn(req)并且如果它返回一个真值,则请求被解析。默认为application/json.

verify

verify选项(如果提供)称为verify(req, res, buf, encoding),其中bufBuffer原始请求正文的 a 并且encoding是请求的编码。可以通过抛出错误来中止解析。

bodyParser.text([options])

返回将所有主体解析为字符串的中间件,并且仅查看Content-Type标头与type选项匹配的请求。此解析器支持自动膨胀gzipdeflate编码。

body包含解析数据的新字符串填充在request 中间件之后的对象上(即req.body)。这将是一个字符串的身体。

Options

text函数采用一个可选options对象,该对象可能包含以下任何键:

defaultCharset

如果Content-Type请求头中未指定字符集,则为文本内容指定默认字符集。默认为utf-8.

inflate

当设置为 true,则放气(压缩)的物体将被充气;当 false,放气的实体被拒绝。默认为true.

limit

控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果是字符串,则将该值传递给 字节库进行解析。默认为'100kb'.

type

type选项用于确定中间件将解析的媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则type选项直接传递给 type-is 库,这可以是扩展名(如json)、mime 类型(如application/json)或带有通配符的 mime 类型(如*/**/json)。如果是函数,则该type 选项被称为 asfn(req)并且如果它返回一个真值,则请求被解析。默认为application/json.

verify

verify选项(如果提供)称为verify(req, res, buf, encoding),其中bufBuffer原始请求正文的 a 并且encoding是请求的编码。可以通过抛出错误来中止解析。

bodyParser.urlencoded([options])

返回仅解析urlencoded正文并仅查看Content-Type标头与type选项匹配的请求的中间件。此解析器仅接受主体的 UTF-8 编码,并支持自动膨胀gzipdeflate编码。

在中间件之后的对象body上填充包含解析数据的新对象request(即req.body)。该对象将包含键值对,其中值可以是字符串或数组(when extendedis false),或任何类型(when extendedis true)。

Options

urlencoded函数采用一个可选options对象,该对象可能包含以下任何键:

extended

extended选项允许在使用querystring库 (when false) 或qs库 (when true)解析 URL 编码数据之间进行选择。“扩展”语法允许将丰富的对象和数组编码为 URL 编码格式,从而实现类似 JSON 的 URL 编码体验。有关更多信息,请 参阅 qs 库

默认为true,但不推荐使用默认值。请研成之间的区别qsquerystring,并选择适当的设置。

inflate

当设置为 true,则放气(压缩)的物体将被充气;当 false,放气的实体被拒绝。默认为true.

limit

控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果是字符串,则将该值传递给 字节库进行解析。默认为'100kb'.

parameterLimit

parameterLimit选项控制 URL 编码数据中允许的最大参数数。如果请求包含的参数多于该值,则会向客户端返回 413。默认为1000.

type

type选项用于确定中间件将解析的媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则type选项直接传递给 type-is 库,这可以是扩展名(如json)、mime 类型(如application/json)或带有通配符的 mime 类型(如*/**/json)。如果是函数,则该type 选项被称为 asfn(req)并且如果它返回一个真值,则请求被解析。默认为application/json.

verify

verify选项(如果提供)称为verify(req, res, buf, encoding),其中bufBuffer原始请求正文的 a 并且encoding是请求的编码。可以通过抛出错误来中止解析。

错误

该模块提供的中间件创建使用错误的 http-errors模块。错误通常包含一个status/statusCode属性,其中包含建议的 HTTP 响应代码、一个expose用于确定是否message应向客户端显示该属性的属性、一个type用于确定不与 匹配的错误类型的属性message以及一个body包含读取正文的属性,如果可用。

以下是创建的常见错误,但任何错误都可能因各种原因而出现。

不支持内容编码

当请求的Content-Encoding标头包含编码但“inflation”选项设置为时,将发生此错误false。该 status属性设置为415,该type属性设置为 'encoding.unsupported',和charset属性将被设置为不支持的编码。

实体解析失败

当请求包含中间件无法解析的实体时,将发生此错误。该status属性设置为400,该type 属性设置为'entity.parse.failed',并且body属性设置为失败解析实体值。

实体验证失败

当请求包含无法通过定义的verify选项验证失败的实体时,将发生此错误。该status属性设置为403,该type属性设置为'entity.verify.failed',并且 body属性设置为验证失败的实体价值。

请求中止

当请求在读取正文完成之前被客户端中止时,将发生此错误。该received属性将设置为中止请求之前收到的字节数,并将该expected属性设置为预期的字节数。该status属性设置400type属性设置为'request.aborted'

请求实体太大

当请求正文的大小大于“限制”选项时,将发生此错误。该limit属性将设置为字节限制,该length 属性将设置为请求正文的长度。该status属性设置为413并且该type属性设置为'entity.too.large'

请求大小与内容长度不匹配

当请求的长度与Content-Length标头的长度不匹配时,将发生此错误。这通常发生在请求格式错误时,通常Content-Length是基于字符而不是字节计算标头时。该status属性设置为400并且该type属性设置为'request.size.invalid'

不应设置流编码

req.setEncoding在此中间件之前调用方法时会发生此错误。该模块仅直接对字节进行操作req.setEncoding,使用该模块时不能调用。该status属性设置为 500并且该type属性设置为'stream.encoding.set'

参数太多

当请求的内容超过parameterLimiturlencoded解析器配置的内容时,就会发生此错误 。该status属性设置为 413并且该type属性设置为'parameters.too.many'

不受支持的字符集“BOGUS”

当请求Content-Type头中有字符集参数,但iconv-lite模块不支持或解析器不支持时,会发生此错误 。字符集包含在消息和charset属性中。该status属性设置为415,该 type属性设置为'charset.unsupported',并且charset属性设置为不支持的字符集。

不支持的内容编码“伪造”

当请求的Content-Encoding标头包含不受支持的编码时,将发生此错误。编码包含在消息和encoding属性中。的status属性被设置为415,所述type属性被设置为'encoding.unsupported',将encoding 属性被设置为不被支持的编码。

例子

Express/Connect 顶级通用

此示例演示添加通用 JSON 和 URL 编码的解析器作为顶级中间件,它将解析所有传入请求的正文。这是最简单的设置。

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

// parse application/json
app.use(bodyParser.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))
})

特快专线

此示例演示了专门向需要它们的路由添加正文解析器。通常,这是将 body-parser 与 Express 结合使用的最推荐方式。

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 /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  res.send('welcome, ' + req.body.username)
})

// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
  // create user in req.body
})

更改解析器的接受类型

所有解析器都接受一个type选项,该选项允许您更改 Content-Type中间件将解析的内容。

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

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

项目地址:https://github.com/expressjs/body-parser

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

目前还没有任何评论,快来抢沙发吧!