目录
[express.json 中间件的使用](#express.json 中间件的使用)
[express.urlencoded 中间件的使用](#express.urlencoded 中间件的使用)
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 默认等于 undefined
console.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-data
app.use(bodyParser.json()) // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
app.post('/profile', upload.array(), (req, res, next) => {
console.log(req.body)
res.json(req.body)
})