自定义中间件
2021-05-24 本文已影响0人
過尽千帆_YL
1. 需求描述与实现步骤
自己手动模拟一个类似于 express.urlencoded这样的中间件,来解析POST 提交到服务器的表单数据。
实现步骤:
① 定义中间件
② 监听 req 的 data 事件
③ 监听 req 的 end 事件
④ 使用 querystring 模块解析请求体数据
⑤ 将解析出来的数据对象挂载为 req.body
⑥ 将自定义中间件封装为模块
2. 定义中间件
使用 app.use() 来定义全局生效的中间件,代码如下:
app.use(function(req,res,next){
// 中间件的业务逻辑
})
3. 监听 req 的 data 事件
// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
let str = ''
// 2. 监听 req 的 data 事件
req.on('data', (chunk) => {
str += chunk
})
4. 监听 req 的 end 事件
当客户端最终把所有数据发送到服务器之后,会自动触发 req 的 end 事件。
因此,我们可以在req 的 end 事件中,拿到并处理完整的请求体数据。示例代码如下:
req.on('end', () => {
// 在 str 中存放的是完整的请求体数据
console.log(str)
})
5. 使用 querystring 模块解析请求体数据
Node.js 内置了一个querystring 模块,专门用来处理查询字符串。通过这个模块提供的 parse() 函数,可以轻松把 查询字符串,解析成对象的格式。示例代码如下:
// 导入 Node.js 内置的 querystring 模块
const qs = require('querystring')
const body = qs.parse(str)
6. 将解析出来的数据对象挂载为 req.body
为了方便在后续的业务处理流程中,能够直接访问当前中间件解析出来的请求体对象,我们将解析出来的数据,挂载 为 req 的自定义属性,命名为req.body。示例代码如下:
// 3. 监听 req 的 end 事件
req.on('end', () => {
// 在 str 中存放的是完整的请求体数据
// console.log(str)
// TODO: 把字符串格式的请求体数据,解析成对象格式
const body = qs.parse(str)
req.body = body
next()
})
7. 将自定义中间件封装为模块
为了优化代码的结构,我们可以把自定义的中间件函数,封装为独立的模块,示例代码如下:
// 导入 Node.js 内置的 querystring 模块
const qs = require('querystring')
const bodyParser = (req, res, next) => {
// 定义中间件具体的业务逻辑
// 1. 定义一个 str 字符串,专门用来存储客户端发送过来的请求体数据
let str = ''
// 2. 监听 req 的 data 事件
req.on('data', (chunk) => {
str += chunk
})
// 3. 监听 req 的 end 事件
req.on('end', () => {
// 在 str 中存放的是完整的请求体数据
// console.log(str)
// TODO: 把字符串格式的请求体数据,解析成对象格式
const body = qs.parse(str)
req.body = body
next()
})
}
module.exports = bodyParser