美文网首页Vue.js
自定义中间件

自定义中间件

作者: 過尽千帆_YL | 来源:发表于2021-05-24 19:55 被阅读0次

    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
    
    

    相关文章

      网友评论

        本文标题:自定义中间件

        本文链接:https://www.haomeiwen.com/subject/ewltsltx.html