express.urlencoded() 方法
在 Web 开发中,表单提交是最常见的用户交互方式之一。Express.js 框架提供了一个方便的中间件 express.urlencoded(),用于解析 URL 编码的表单数据。
一、什么是 express.urlencoded()
express.urlencoded([options])
是 Express.js 内置的中间件函数,用于解析包含 URL 编码负载的请求。它基于 body-parser
库,可以将表单数据转换成 JavaScript 对象,方便开发者访问和处理。
二、工作原理
当用户提交表单时,浏览器会将表单数据以 URL 编码的形式发送到服务器。express.urlencoded()
中间件会拦截这些请求,解析编码后的数据,并将解析后的数据添加到 req.body 对象中。
例如,用户提交了一个包含用户名和密码的表单,express.urlencoded()
会将数据解析成如下形式:
req.body = {
username: 'user123',
password: 'password123'
};
三、options 配置项
express.urlencoded()
方法支持一个可选的 options 对象,用于配置解析行为:
属性 | 描述 | 类型 | 默认值 |
extended | 选择使用 querystring 库(false)或 qs 库(true)解析 URL 编码数据。“扩展”语法允许将丰富的对象和数组编码为 URL 编码格式,从而提供类似 JSON 的 URL 编码体验。 | Boolean | true |
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 |
四、示例
以下代码演示了如何在 Express.js 应用中使用 express.urlencoded()
方法:
const express = require('express');
const app = express();
// 使用默认选项解析 urlencoded 数据
app.use(express.urlencoded());
// 使用自定义选项解析 urlencoded 数据
app.use(express.urlencoded({ extended: false, limit: '500kb' }));
app.post('/submit', (req, res) => {
console.log(req.body);
// 处理表单数据
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
五、注意事项
由于 req.body
的形状基于用户控制的输入,因此此对象中的所有属性和值都是不可信的,在信任之前应进行验证。例如,req.body.foo.toString()
可能会以多种方式失败,例如 foo
可能不存在或可能不是字符串,而 toString
可能不是函数,而是字符串或其他用户输入。