Node.js 主体解析中间件。
在处理程序之前在中间件中解析传入的请求主体,可在 req.body
属性下获得。
注意由于 req.body
的形状基于用户控制的输入,因此此对象中的所有属性和值均不可信,在信任之前应进行验证。例如,req.body.foo.toString()
可能会以多种方式失败,例如 foo
属性可能不存在或不是字符串,并且 toString
可能不是函数,而是字符串或其他用户输入。
这不能处理多部分主体,因为它们复杂且通常很大。对于多部分主体,你可能对以下模块感兴趣
此模块提供以下解析器
您可能感兴趣的其他正文解析器
$ npm install body-parser
var bodyParser = require('body-parser')
bodyParser
对象公开各种工厂以创建中间件。当 Content-Type
请求头与 type
选项匹配时,所有中间件都会使用已解析的正文填充 req.body
属性,或者在没有正文可解析、Content-Type
不匹配或发生错误时填充一个空对象 ({}
)。
此模块返回的各种错误在 错误部分 中进行了描述。
返回仅解析 json
且仅查看 Content-Type
头与 type
选项匹配的请求的中间件。此解析器接受正文的任何 Unicode 编码,并支持自动填充 gzip
和 deflate
编码。
在中间件 (即 req.body
) 之后,将在 request
对象上填充包含已解析数据的新 body
对象。
json
函数接受一个可选的 options
对象,该对象可能包含以下任何键
当设置为 true
时,将填充已压缩 (压缩) 的正文;当为 false
时,将拒绝已压缩的正文。默认为 true
。
控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果它是一个字符串,则将该值传递给 bytes 库进行解析。默认为 '100kb'
。
reviver
选项作为第二个参数直接传递给 JSON.parse
。您可以在 MDN 关于 JSON.parse 的文档 中找到有关此参数的更多信息。
当设置为 true
时,将仅接受数组和对象;当为 false
时,将接受 JSON.parse
接受的任何内容。默认为 true
。
type
选项用于确定中间件将解析的媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则 type
选项将直接传递给 type-is 库,这可以是扩展名 (如 json
)、MIME 类型 (如 application/json
) 或带有通配符的 MIME 类型 (如 */*
或 */json
)。如果是一个函数,则 type
选项将作为 fn(req)
调用,并且如果它返回真值,则解析请求。默认为 application/json
。
如果提供了 verify
选项,则会将其调用为 verify(req, res, buf, encoding)
,其中 buf
是原始请求正文的 Buffer
,而 encoding
是请求的编码。可以通过抛出错误来中止解析。
返回将所有正文解析为 Buffer
的中间件,并且只查看 Content-Type
标头与 type
选项匹配的请求。此解析器支持 gzip
和 deflate
编码的自动解压缩。
在中间件之后,一个包含已解析数据的 body
新对象填充到 request
对象上(即 req.body
)。这将是正文的 Buffer
对象。
raw
函数采用一个可选的 options
对象,该对象可能包含以下任何键
当设置为 true
时,将填充已压缩 (压缩) 的正文;当为 false
时,将拒绝已压缩的正文。默认为 true
。
控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果它是一个字符串,则将该值传递给 bytes 库进行解析。默认为 '100kb'
。
type
选项用于确定中间件将解析哪种媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则 type
选项将直接传递给 type-is 库,这可以是扩展名(如 bin
)、MIME 类型(如 application/octet-stream
)或带有通配符的 MIME 类型(如 */*
或 application/*
)。如果是一个函数,则 type
选项将被调用为 fn(req)
,如果它返回真值,则解析请求。默认为 application/octet-stream
。
如果提供了 verify
选项,则会将其调用为 verify(req, res, buf, encoding)
,其中 buf
是原始请求正文的 Buffer
,而 encoding
是请求的编码。可以通过抛出错误来中止解析。
返回将所有正文解析为字符串的中间件,并且只查看 Content-Type
标头与 type
选项匹配的请求。此解析器支持 gzip
和 deflate
编码的自动解压缩。
在中间件之后,一个包含已解析数据的 body
新字符串填充到 request
对象上(即 req.body
)。这将是正文的字符串。
text
函数采用一个可选的 options
对象,该对象可能包含以下任何键
如果请求的 Content-Type
标头中未指定字符集,则指定文本内容的默认字符集。默认为 utf-8
。
当设置为 true
时,将填充已压缩 (压缩) 的正文;当为 false
时,将拒绝已压缩的正文。默认为 true
。
控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果它是一个字符串,则将该值传递给 bytes 库进行解析。默认为 '100kb'
。
type
选项用于确定中间件将解析哪种媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则 type
选项将直接传递给 type-is 库,这可以是扩展名(如 txt
)、MIME 类型(如 text/plain
)或带有通配符的 MIME 类型(如 */*
或 text/*
)。如果是一个函数,则 type
选项将被调用为 fn(req)
,如果它返回真值,则解析请求。默认为 text/plain
。
如果提供了 verify
选项,则会将其调用为 verify(req, res, buf, encoding)
,其中 buf
是原始请求正文的 Buffer
,而 encoding
是请求的编码。可以通过抛出错误来中止解析。
返回仅解析 urlencoded
正文并且只查看 Content-Type
标头与 type
选项匹配的请求的中间件。此解析器仅接受正文的 UTF-8 编码,并且支持 gzip
和 deflate
编码的自动解压缩。
在中间件之后,request
对象上会填充一个包含已解析数据的新的 body
对象(即 req.body
)。此对象将包含键值对,其中值可以是字符串或数组(当 extended
为 false
时),或任何类型(当 extended
为 true
时)。
urlencoded
函数接受一个可选的 options
对象,该对象可能包含以下任何键
extended
选项允许选择使用 querystring
库(当 false
时)或 qs
库(当 true
时)解析 URL 编码数据。“extended” 语法允许将丰富的对象和数组编码为 URL 编码格式,从而使用 URL 编码获得类似 JSON 的体验。有关更多信息,请 参阅 qs 库。
默认为 true
,但使用默认值已被弃用。请研究 qs
和 querystring
之间的差异,并选择适当的设置。
当设置为 true
时,将填充已压缩 (压缩) 的正文;当为 false
时,将拒绝已压缩的正文。默认为 true
。
控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果它是一个字符串,则将该值传递给 bytes 库进行解析。默认为 '100kb'
。
parameterLimit
选项控制 URL 编码数据中允许的最大参数数。如果请求包含超过此值的参数,则会向客户端返回 413。默认为 1000
。
type
选项用于确定中间件将解析哪种媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,type
选项将直接传递给 type-is 库,这可以是扩展名(如 urlencoded
)、MIME 类型(如 application/x-www-form-urlencoded
)或带通配符的 MIME 类型(如 */x-www-form-urlencoded
)。如果是一个函数,则 type
选项将作为 fn(req)
调用,并且如果它返回真值,则解析请求。默认为 application/x-www-form-urlencoded
。
如果提供了 verify
选项,则会将其调用为 verify(req, res, buf, encoding)
,其中 buf
是原始请求正文的 Buffer
,而 encoding
是请求的编码。可以通过抛出错误来中止解析。
此模块提供的中间件使用 http-errors
模块 创建错误。这些错误通常具有 status
/statusCode
属性,其中包含建议的 HTTP 响应代码、expose
属性以确定是否应向客户端显示 message
属性、type
属性以确定错误类型而不匹配 message
,以及包含已读取正文的 body
属性(如果可用)。
以下是创建的常见错误,尽管由于各种原因可能会出现任何错误。
当请求包含一个包含编码的 Content-Encoding
标头,但“膨胀”选项设置为 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'
。
当请求在该中间件尝试读取时不再可读时,将发生此错误。这通常意味着此模块中的中间件以外的其他内容已读取请求正文,并且该中间件也配置为读取相同请求。status
属性设置为 500
,type
属性设置为 'stream.not.readable'
。
当请求的内容超过 urlencoded
解析器的已配置 parameterLimit
时,将发生此错误。status
属性设置为 413
,type
属性设置为 'parameters.too.many'
。
当请求在 Content-Type
标头中具有字符集参数,但 iconv-lite
模块不支持它或解析器不支持它时,将发生此错误。字符集包含在消息中以及 charset
属性中。status
属性设置为 415
,type
属性设置为 'charset.unsupported'
,charset
属性设置为不支持的字符集。
当请求具有包含不受支持编码的 Content-Encoding
标头时,将发生此错误。编码包含在消息中以及 encoding
属性中。status
属性设置为 415
,type
属性设置为 'encoding.unsupported'
,encoding
属性设置为不支持的编码。
此示例演示如何将通用 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' }))