Express内置的中间件(express.json和express.urlencoded)格式的请求体数据
目录
Express内置的中间件
express.json 中间件的使用
express.urlencoded 中间件的使用
express.urlencoded([options])
解析req.body的兼容写法
Express内置的中间件
自 Express 4.16.0 版本开始,Express 内置了 3 个常用的中间件,极大的提高了 Express 项目的开发效率和体验
-
express.static快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS样式等(无兼容性) -
express.json解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用) -
express.urlencoded解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
express.json 中间件的使用
-
express.json()中间件,解析表单中的JSON格式的数据 -
案例代码
const express = require('express')
const app = express()// 注意:除了错误级别的中间件,其他的中间件,必须在路由之前进行配置
// 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
app.use(express.json())app.post('/user', (req, res) => {// 在服务器,可以使用 req.body 这个属性,来接收客户端发送过来的请求体数据// 默认情况下,如果不配置解析表单数据中间件,则 req.body 默认等于 undefinedconsole.log(req.body)res.send('ok')
})app.listen(3000, () => {console.log('running……')
})
express.urlencoded 中间件的使用
-
express.urlencoded解析URL-encoded格式的请求体数据 -
案例代码
const express = require('express')
const app = express()// 通过 express.urlencoded() 这个中间件,来解析表单中的 url-encoded 格式的数据
app.use(express.urlencoded({ extended: false }))app.post('/book', (req, res) => {console.log(req.body)res.send(req.body)
})app.listen(3000, () => {console.log('running……')
})
express.urlencoded([options])
这是 Express 中内置的中间件函数。它使用 urlencoded 有效负载解析传入的请求,并且基于 body-parser。
返回仅解析 urlencoded 正文并仅查看 Content-Type 标头与 type 选项匹配的请求的中间件。此解析器仅接受正文的 UTF-8 编码,并支持 gzip 和 deflate 编码的自动膨胀。‘
包含解析数据的新 body 对象在中间件(即 req.body)之后填充到 request 对象上,如果没有要解析的主体、Content-Type 不匹配或发生错误,则填充一个空对象({})。该对象将包含键值对,其中值可以是字符串或数组(当 extended 为 false 时)或任何类型(当 extended 为 true 时)
由于
req.body的形状基于用户控制的输入,因此该对象中的所有属性和值都是不可信的,应该在信任之前进行验证。例如,req.body.foo.toString()可能以多种方式失败,例如foo可能不存在或可能不是字符串,toString可能不是函数,而是字符串或其他用户输入。
下表描述了可选 options 对象的属性。
The following table describes the properties of the optional options object.
| 属性 Property | 描述 Description | 类型 Type | 默认 Default |
|---|---|---|---|
extended | 此选项允许在使用 querystring 库(当 false)或 qs 库(当 true)解析 URL 编码数据之间进行选择。"extended" 语法允许将丰富的对象和数组编码为 URL 编码格式,从而提供类似 JSON 的 URL 编码体验。欲了解更多信息,请 查看 qs 库。 | Boolean | false |
inflate | 启用或禁用处理放气(压缩)的主体;当禁用时,瘪的主体会被拒绝。 | Boolean | true |
limit | 控制最大请求正文大小。如果这是一个数字,则该值指定字节数;如果是字符串,则将值传递给bytes库进行解析。 | Mixed | "100kb" |
parameterLimit | 此选项控制 URL 编码数据中允许的最大参数数。如果请求包含的参数多于该值,则会引发错误。 | Number | 1000 |
type | 这用于确定中间件将解析的媒体类型。此选项可以是字符串、字符串数组或函数。如果不是函数,则 type 选项直接传递给 type-is 库,它可以是扩展名(如 urlencoded)、mime 类型(如 application/x-www-form-urlencoded)或带有通配符的 mime 类型(如 */x-www-form-urlencoded)。如果是函数,则 type 选项被称为 fn(req),如果请求返回真值,则解析请求。 | Mixed | "application/x-www-form-urlencoded" |
verify | 此选项(如果提供)称为 verify(req, res, buf, encoding),其中 buf 是原始请求正文的 Buffer,encoding 是请求的编码。可以通过抛出错误来中止解析。 | 函数 Function | undefined |
解析req.body的兼容写法
包含在请求正文中提交的数据键值对。默认情况下,它是 undefined,并在你使用 body-parser 和 multer 等正文解析中间件时填充。
由于 req.body 的形状基于用户控制的输入,因此该对象中的所有属性和值都是不可信的,应在信任之前进行验证。例如,req.body.foo.toString() 可能以多种方式失败,例如 foo 可能不存在或可能不是字符串,并且 toString 可能不是函数而是字符串或其他用户输入。
以下示例显示如何使用正文解析中间件填充 req.body。
const app = require('express')()
const bodyParser = require('body-parser')
const multer = require('multer') // v1.0.5
const upload = multer() // for parsing multipart/form-dataapp.use(bodyParser.json()) // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencodedapp.post('/profile', upload.array(), (req, res, next) => {console.log(req.body)res.json(req.body)
})
