zoukankan      html  css  js  c++  java
  • 用内置 querystring 模块解析请求体数据

    querystring 模块解析请求体数据

    1. Node.js 内置了一个 querystring 模块,专门用来处理查询字符串。通过这个模块提供的 parse() 函数,可以轻松把查询字符串,解析成对象的格式

    2. 代码码

      // 导入 express 模块
      const express = require('express')
      // 创建 express 的服务器实例
      const app = express()
      // 4. 导入 Node 内置模块 querystring
      const qs = require('querystring')
      
      // 解析表单数据的中间件
      app.use((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)
          // 将字符串格式的请求体数据,解析成对象
          // 5. 调用 qs.parse() 方法,将查询字符串解析成对象
          const body =  qs.parse(str)
          console.log(body)
        })
      })
      
      app.post('/user', (req, res) => {
        res.send('ok')
      })
      
      // 调用 app.listen方法,指定端口号并启动 web 服务器
      app.listen(3000, () => {
        console.log('running……')
      })

    将解析出来的数据对象挂载为 req.body

    1. 上游的中间件和下游的中间件及路由之间,共享同一份 reqres,因此,我们可以将解析出来的数据,挂载为 req 的自定义属性,命名为 req.body,供下游使用

    案例代码

    // 导入 express 模块
    const express = require('express')
    // 创建 express 的服务器实例
    const app = express()
    // 4. 导入 Node 内置模块 querystring
    const qs = require('querystring')
    
    // 解析表单数据的中间件
    app.use((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)
        // 将字符串格式的请求体数据,解析成对象
        // 5. 调用 qs.parse() 方法,将查询字符串解析成对象
        const body =  qs.parse(str)
    
        // 6. 将解析出来的数据对象挂载为 req.body 属性
        req.body = body
        next()
      })
    })
    
    app.post('/user', (req, res) => {
      res.send(req.body)
    })
    
    // 调用 app.listen方法,指定端口号并启动 web 服务器
    app.listen(3000, () => {
      console.log('running……')
    })

    将自定义中间件封装为模块

    1. 为了优化代码的结构,我们可以把自定义的中间件函数,封装为独立的模块

    2. 代码如下:

    3. // custom-body-parser.js
      
      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)
          // 将字符串格式的请求体数据,解析成对象
          // 5. 调用 qs.parse() 方法,将查询字符串解析成对象
          const body =  qs.parse(str)
      
          // 6. 将解析出来的数据对象挂载为 req.body 属性
          req.body = body
          next()
        })
      }
      
      module.exports = bodyParser
      // 对自定义的中间件进行模块化拆分
      
      // 导入 express 模块
      const express = require('express')
      // 创建 express 的服务器实例
      const app = express()
      
      // 1. 导入自己封装的中间件模块
      const customBodyParser = require('./017-custom-body-parser')
      // 2. 将自定义的中间件函数,注册为全局可用的中间件
      app.use(customBodyParser)
      
      app.post('/user', (req, res) => {
        res.send(req.body)
      })
      
      // 调用 app.listen方法,指定端口号并启动 web 服务器
      app.listen(3000, () => {
        console.log('running……')
      })
    时间如白驹过隙,忽然而已,且行且珍惜......
  • 相关阅读:
    C++——string转char[]
    Ackerman的非递归算法(未解决)
    单链表——递归求最大整数、节点个数、平均值
    队列——以数组Q[m]存放循环队列元素,设置一个标志tag,以tag=0和tag=1来区别在头指针和尾指针相等时,队列为空或满
    队列——假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意:不设头指针), * 试编写相应的置空队列、判断队列是否为空、入队和出队等算法。
    栈——判断回文
    栈——表达式求值
    栈——匹配()[]
    栈——十进制转八进制
    动态获取导航栏
  • 原文地址:https://www.cnblogs.com/UnfetteredMan/p/13854627.html
Copyright © 2011-2022 走看看