body-parser 是 Node.js 正文解析中间件
在处理程序之前在中间件中解析传入的请求正文,在 req.body
属性下可用。
注意由于req.body
的形状基于用户控制的输入,因此该对象中的所有属性和值都是不受信任的,应在信任之前进行验证。例如,req.body.foo.toString()
可能以多种方式失败,例如foo
属性可能不存在或可能不是字符串,并且toString
可能不是函数而是字符串或其他用户输入。
由于其复杂且通常较大的性质,这不处理多部分实体。对于多部分实体,您可能对以下模块感兴趣:
该模块提供以下解析器:
您可能感兴趣的其他身体解析器:
安装
$ npm install body-parser
应用程序接口
var bodyParser = require ( 'body-parser' )
该bodyParser
对象公开各种工厂以创建中间件。req.body
当Content-Type
请求标头与type
选项匹配时,所有中间件都将使用解析的正文填充属性,{}
如果没有要解析的正文、Content-Type
不匹配或发生错误,则使用空对象 ( )填充。
该模块返回的各种错误在错误部分中进行了描述 。
bodyParser.json([options])
返回仅解析json
和仅查看Content-Type
标头与type
选项匹配的请求的中间件。此解析器接受正文的任何 Unicode 编码,并支持自动膨胀gzip
和 deflate
编码。
在中间件之后的对象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)
,其中buf
是Buffer
原始请求正文的 a 并且encoding
是请求的编码。可以通过抛出错误来中止解析。
bodyParser.raw([options])
返回将所有主体解析为 aBuffer
并且仅查看Content-Type
标头与type
选项匹配的请求的中间件。此解析器支持自动膨胀gzip
和deflate
编码。
在中间件之后的对象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)
,其中buf
是Buffer
原始请求正文的 a 并且encoding
是请求的编码。可以通过抛出错误来中止解析。
bodyParser.text([options])
返回将所有主体解析为字符串的中间件,并且仅查看Content-Type
标头与type
选项匹配的请求。此解析器支持自动膨胀gzip
和deflate
编码。
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)
,其中buf
是Buffer
原始请求正文的 a 并且encoding
是请求的编码。可以通过抛出错误来中止解析。
bodyParser.urlencoded([options])
返回仅解析urlencoded
正文并仅查看Content-Type
标头与type
选项匹配的请求的中间件。此解析器仅接受主体的 UTF-8 编码,并支持自动膨胀gzip
和deflate
编码。
在中间件之后的对象body
上填充包含解析数据的新对象request
(即req.body
)。该对象将包含键值对,其中值可以是字符串或数组(when extended
is false
),或任何类型(when extended
is true
)。
Options
该urlencoded
函数采用一个可选options
对象,该对象可能包含以下任何键:
extended
该extended
选项允许在使用querystring
库 (when false
) 或qs
库 (when true
)解析 URL 编码数据之间进行选择。“扩展”语法允许将丰富的对象和数组编码为 URL 编码格式,从而实现类似 JSON 的 URL 编码体验。有关更多信息,请 参阅 qs 库。
默认为true
,但不推荐使用默认值。请研成之间的区别qs
和querystring
,并选择适当的设置。
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)
,其中buf
是Buffer
原始请求正文的 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
属性设置400
和type
属性设置为'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'
。
参数太多
当请求的内容超过parameterLimit
为urlencoded
解析器配置的内容时,就会发生此错误 。该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' }))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论