1. body-parser

NPM Version NPM Downloads Build Status Test Coverage

Node.js body 解析中间件。

在请求被处理程序处理之前解析传入的请求主体, Parse incoming request bodies in a middleware before your handlers, available under the req.body property.

注意: req.body 对象的形式是基于用户输入的,对象中所有的属性和其值都是不可信的,因此在信任之前进行验证。 例如,req.body.foo.toString() 可能会在多种情况下失败,例如,foo 属性可能不存在,也可能不是字符串,或者 toString 不是一个函数而是一个字符串或其他用户输入。

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

此中间件不能处理多部分主体的情况,由于它们的很杂复杂性和通常又很大。对于多部分的主体,您可能对以下模块感兴趣:

这个模块提供以下解析器:

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

1.1. 安装

$ npm install body-parser

1.2. API

var bodyParser = require('body-parser')

bodyParser 对象暴露各种工厂函数来创建中间件。当 Content-Type 请求头与 type 选项匹配时, 所有的中间件都会使用解析后的主体来填充 req.body 属性,如果没有主体可以解析、Content-Type 不匹配或发生错误,那么所有的中间件都会使用空对象({})。

错误部分描述了这个模块返回的各种错误。

1.2.1. bodyParser.json([options])

返回一个只解析 json 的中间件,并且只会查找只查找 Content-Type 头部与 type 选项相匹配的请求。 这个解析器接受主体的任何 Unicode 编码,并支持自动解压 gzipdeflate 编码。

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

选项

json 函数接受一个可选的 options 对象,这个对象可以包含下面的内容:

inflate

inflate 设置为 true 时,被压缩过的主体将被解压; 当为 false,被压缩过的主体将被拒绝。默认为 true

limit

控制请求主体的最大尺寸。如果 limit 是一个数字,那么该值指定了字节数,这个值将被传入 bytes 库进行解析。默认为 '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 选项被以 fn(req) 的形式调用,并且如果返回一个真值,则该请求被解析。 默认为 application/json

verify

如果提供了 verify 选项,则以 verify(req, res, buf, encoding) 形式被调用,其中 buf 为原始请求体的 Bufferencoding 为请求的编码。抛出错误可以中止解析。

1.2.2. bodyParser.raw([options])

返回将所有主体解析为 Buffer 的中间件,并仅查看 Content-Type 头与 type 选项匹配的请求。 这个解析器支持支持自动解压 gzipdeflate 编码。

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

Options

raw 函数接受一个可选的 options 对象,这个对象可以包含下面的内容:

inflate

inflate 设置为 true 时,被压缩过的主体将被解压; 当为 false,被压缩过的主体将被拒绝。默认为 true

limit

控制请求主体的最大尺寸。如果 limit 是一个数字,那么该值指定了字节数,这个值将被传入 bytes 库进行解析。默认为 '100kb'

type

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

verify

如果提供了 verify 选项,则以 verify(req, res, buf, encoding) 形式被调用,其中 buf 为原始请求体的 Bufferencoding 为请求的编码。抛出错误可以中止解析。

1.2.3. bodyParser.text([options])

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

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

Options

text 函数接受一个可选的 options 对象,这个对象可以包含下面的内容:

defaultCharset

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

inflate

inflate 设置为 true 时,被压缩过的主体将被解压; 当为 false,被压缩过的主体将被拒绝。默认为 true

limit

控制请求主体的最大尺寸。如果 limit 是一个数字,那么该值指定了字节数,这个值将被传入 bytes 库进行解析。默认为 '100kb'

type

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

verify

如果提供了 verify 选项,则以 verify(req, res, buf, encoding) 形式被调用,其中 buf 为原始请求体的 Bufferencoding 为请求的编码。抛出错误可以中止解析。

1.2.4. bodyParser.urlencoded([options])

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

包含解析的数据的新的 body 对象被填充在中间件之后的 request 对象(即,req.body)上。 这个对象将包含一组键值对,其中值可以是一个字符串或数组(当 extendedfalse 时),或任何类型(当 extendedtrue 时)。

Options

urlencoded 函数接受一个可选的 options 对象,这个对象可以包含下面的内容:

extended

extended 选项允许选择使用 querystring 库(如果为 false)或 qs 库(如果为 true)来解析 URL 编码的数据。 "extended" 语法允许将丰富的对象和数组编码为 URL 编码的格式,从而允许使用类似 JSON 体验的 URL 编码的数据。有关更多信息,请参阅 qs 库

默认为 true,但使用默认值已被弃用。请研究 qsquerystring 之间的差异,并选择适当的设置。

inflate

inflate 设置为 true 时,被压缩过的主体将被解压; 当为 false,被压缩过的主体将被拒绝。默认为 true

limit

控制请求主体的最大尺寸。如果 limit 是一个数字,那么该值指定了字节数,这个值将被传入 bytes 库进行解析。默认为 '100kb'

parameterLimit

parameterLimit 选项控制了 URL 编码数据中允许的最大参数数目。 如果一个请求包含比这个值更多的参数,一个 413 将被返回给客户端。 默认为 1000

type

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 选项,则以 verify(req, res, buf, encoding) 形式被调用,其中 buf 为原始请求体的 Bufferencoding 为请求的编码。抛出错误可以中止解析。

1.3. Errors

此模块提供的中间件根据解析过程中的错误情况创建错误。 这些错误通常具有 status/statusCode 属性,其中包含建议的 HTTP 响应代码,用于确定 message 属性是否应显示给客户端的 expose 属性,用于确定错误类型而不与 message 匹配的 type 属性,以及包含当前读取的主体的 body 属性(如果可用)。

以下是发布的常见错误,但出于各种原因可能会出现任何错误。

1.3.1. content encoding unsupported

This error will occur when the request had a Content-Encoding header that contained an encoding but the "inflation" option was set to false. The status property is set to 415, the type property is set to 'encoding.unsupported', and the charset property will be set to the encoding that is unsupported.

1.3.2. request aborted

This error will occur when the request is aborted by the client before reading the body has finished. The received property will be set to the number of bytes received before the request was aborted and the expected property is set to the number of expected bytes. The status property is set to 400 and type property is set to 'request.aborted'.

1.3.3. request entity too large

This error will occur when the request body's size is larger than the "limit" option. The limit property will be set to the byte limit and the length property will be set to the request body's length. The status property is set to 413 and the type property is set to 'entity.too.large'.

1.3.4. request size did not match content length

This error will occur when the request's length did not match the length from the Content-Length header. This typically occurs when the request is malformed, typically when the Content-Length header was calculated based on characters instead of bytes. The status property is set to 400 and the type property is set to 'request.size.invalid'.

1.3.5. stream encoding should not be set

This error will occur when something called the req.setEncoding method prior to this middleware. This module operates directly on bytes only and you cannot call req.setEncoding when using this module. The status property is set to 500 and the type property is set to 'stream.encoding.set'.

1.3.6. too many parameters

This error will occur when the content of the request exceeds the configured parameterLimit for the urlencoded parser. The status property is set to 413 and the type property is set to 'parameters.too.many'.

1.3.7. unsupported charset "BOGUS"

This error will occur when the request had a charset parameter in the Content-Type header, but the iconv-lite module does not support it OR the parser does not support it. The charset is contained in the message as well as in the charset property. The status property is set to 415, the type property is set to 'charset.unsupported', and the charset property is set to the charset that is unsupported.

1.3.8. unsupported content encoding "bogus"

This error will occur when the request had a Content-Encoding header that contained an unsupported encoding. The encoding is contained in the message as well as in the encoding property. The status property is set to 415, the type property is set to 'encoding.unsupported', and the encoding property is set to the encoding that is unsupported.

1.4. 示例

1.4.1. Express/Connect top-level generic

此示例演示了将通用的 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))
})

1.4.2. Express route-specific

这个例子演示了如何将body 解析器专门添加到需要它们的路由中。 一般来说,这是 Express 使用 body-parser 最值得推荐的方法。

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) {
  if (!req.body) return res.sendStatus(400)
  res.send('welcome, ' + req.body.username)
})

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

1.4.3. 更改解析器接受的类型

所有的解析器都接受一个 type 选项,允许你改变中间件解析的 Content-Type

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

var app = express()

// 将各种不同的自定义 JSON 类型解析为JSON
app.use(bodyParser.json({ type: 'application/*+json' }))

// 解析一些自定义的东西到一个 Buffer
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))

// 将HTML body 解析为一个字符串
app.use(bodyParser.text({ type: 'text/html' }))

1.5. License

MIT

Copyright © tuzhu008 2017 all right reserved,powered by Gitbook该文件修订时间: 2018-01-18 15:38:10

results matching ""

    No results matching ""