c语言sscanf函数的用法是什么
308
2022-09-16
Express中间件③(自定义中间件)
文章目录
自定义中间件实现步骤
定义中间件监听 req 的 data 事件监听 req 的 end 事件使用 querystring 模块解析请求体数据将解析出来的数据对象挂载为 req.body将自定义中间件封装为模块
自定义中间件
自己手动模拟一个类似于 express.urlencoded 这样的中间件,来解析 POST 提交到服务器的表单数据。
实现步骤如下: ① 定义中间件 ② 监听 req 的 data 事件 ③ 监听 req 的 end 事件 ④ 使用 querystring 模块解析请求体数据 ⑤ 将解析出来的数据对象挂载为 req.body ⑥ 将自定义中间件封装为模块
实现步骤
定义中间件
使用 app.use() 来定义全局生效的中间件,代码如下:
监听 req 的 data 事件
在中间件中,需要监听 req 对象的 data 事件,来获取客户端发送到服务器的数据。
如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后,分批发送到服务器。所以 data 事件可能会触发多次(也就是说每发送过来一次数据,都会触发一次data事件),每一次触发 data 事件时,获取到数据只是完整数据的一部分,需要手动对接收到的数据进行拼接。
如下:
监听 req 的 end 事件
当请求体数据接收完毕之后,会自动触发 req 的 end 事件。
因此,我们可以在 req 的 end 事件中,拿到并处理完整的请求体数据。示例代码如下:
使用 querystring 模块解析请求体数据
Node.js 内置了一个 querystring 模块,专门用来处理查询字符串。通过这个模块提供的 parse() 函数,可以轻松把查询字符串,解析成对象的格式。示例代码如下:
将解析出来的数据对象挂载为 req.body
上游的中间件和下游的中间件及路由之间,共享同一份 req 和 res。因此,我们可以将解析出来的数据,挂载为 req 的自定义属性,命名为 req.body,供下游使用。示例代码如下:
将自定义中间件封装为模块
为了优化代码的结构,我们可以把自定义的中间件函数,封装为独立的模块,示例代码如下:
总结以上几个步骤,代码实现如下:
自定义模块部分:
// 导入 Node.js 内置的 querystring 模块const qs = require('querystring')const bodyParser = (req, res,) => { // 定义中间件具体的业务逻辑 // 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 =
主程序部分:
// 导入 express 模块const express = require('express')// 创建 express 的服务器实例const app = express()// 1. 导入自己封装的中间件模块const customBodyParser = require('./14.custom-body-parser')// 2. 将自定义的中间件函数,注册为全局可用的中间件app.use(customBodyParser)app.post('/user', (req,) => { res.send(req.body)})// 调用 app.listen 方法,指定端口号并启动web服务器app.listen(80, function () { console.log('Express server running at http://127.0.0.1')})
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~