Node.js - Acerca del middleware express (middleware personalizado)

¡Acostúmbrate a escribir juntos! Este es el décimo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

Descripción del requisito

Simule un middleware como express.urlencodedeste para analizar los datos del formulario enviados al servidor


Pasos de implementación

  • Definir software intermedio
  • Escuche el evento de datos de req
  • Escuche el evento final de req
  • Analizar los datos del cuerpo de la solicitud utilizando el módulo de cadena de consulta
  • Monte el objeto de datos analizados como req.body
  • Encapsule el middleware personalizado como módulos

Implementación

  • Definir software intermedio

    const express = require('express')
    const app = express()
    
    // 定义解析表单数据的中间件
    app.use((req, res, next) => {
        // 定义中间件具体的业务逻辑
    })
    
    app.listen(80, ()=> {
        console.log('express 服务器运行在 http://127.0.0.1.80')
    })
    复制代码
  • Escuche el evento de datos de req

    En el middleware, debe escuchar el evento de datos del objeto req para obtener los datos enviados por el cliente al servidor.

    Si la cantidad de datos es relativamente grande y no se puede enviar a la vez, el cliente cortará los datos y los enviará al servidor por lotes. Por lo tanto, el evento de datos puede activarse muchas veces. Cada vez que se activa el evento de datos, los datos adquiridos son solo una parte de los datos completos, y los datos recibidos deben empalmarse manualmente.

    const express = require('express')
    const app = express()
    
    // 定义解析表单数据的中间件
    app.use((req, res, next) => {
        // 定义中间件具体的业务逻辑
        
        //1、定义一个空字符串,用来存放客户端发送来的请求体数据
        let str = ''
        //2、监听 req 的 data 事件
        req.on('data', (chunk)=>{
            str += chunk
        })
    })
    
    app.listen(80, ()=> {
        console.log('express 服务器运行在 http://127.0.0.1.80')
    })
    复制代码
  • Escuche el evento final de req

    Cuando se reciben los datos del cuerpo de la solicitud, los eventos req y end se activarán automáticamente. Por lo tanto, los datos completos del cuerpo de la solicitud se pueden obtener y procesar en el evento end de req.

    const express = require('express')
        const app = express()
        
        // 定义解析表单数据的中间件
        app.use((req, res, next) => {
            // 定义中间件具体的业务逻辑
            
            //1、定义一个空字符串,用来存放客户端发送来的请求体数据
            let str = ''
            
            //2、监听 req 的 data 事件
            req.on('data', (chunk)=>{
                str += chunk
            })
            
            //3、监听 req 的 end 事件
            req.on('end', () => {
                // 在 str 中存放的时完整的请求体数据
                console.log(str)
            })
        })
        
        app.post('/user', (req, res) => {
            res.send('ok')
        })
        
        app.listen(80, ()=> {
            console.log('express 服务器运行在 http://127.0.0.1.80')
        })
    复制代码
  • Analizar los datos del cuerpo de la solicitud utilizando el módulo de cadena de consulta

    Node.js tiene un módulo de cadena de consulta incorporado, que se usa especialmente para procesar cadenas de consulta. A través de las parse()funciones , puede analizar fácilmente la cadena de consulta en un formato de objeto.

    const express = require('express')
    
    //导入处理 querystring 的 node.js 内置模块
    const qs = require('querystring')
    
    const app = express()
        
        // 定义解析表单数据的中间件
        app.use((req, res, next) => {
            // 定义中间件具体的业务逻辑
            
            //1、定义一个空字符串,用来存放客户端发送来的请求体数据
            let str = ''
            
            //2、监听 req 的 data 事件
            req.on('data', (chunk)=>{
                str += chunk
            })
            
            //3、监听 req 的 end 事件
            req.on('end', () => {
                // 在 str 中存放的时完整的请求体数据
                console.log(str)
                
                //4、把字符串格式的请求体数据,解析成对象格式
                const body = qs.parse(str)
                console.log(body)
            })
        })
        
        app.post('/user', (req, res) => {
            res.send('ok')
        })
        
        app.listen(80, ()=> {
            console.log('express 服务器运行在 http://127.0.0.1.80')
        })
    复制代码
  • Monte el objeto de datos analizados comoreq.body

    A req y res se comparten entre el middleware ascendente y el middleware descendente y los enrutadores. Por lo tanto, los datos analizados se pueden montar como un atributo personalizado de req denominado req.body para uso posterior.

    const express = require('express')
    
    //导入处理 querystring 的 node.js 内置模块
    const qs = require('querystring')
    
    const app = express()
        
        // 定义解析表单数据的中间件
        app.use((req, res, next) => {
            // 定义中间件具体的业务逻辑
            
            //1、定义一个空字符串,用来存放客户端发送来的请求体数据
            let str = ''
            
            //2、监听 req 的 data 事件
            req.on('data', (chunk)=>{
                str += chunk
            })
            
            //3、监听 req 的 end 事件
            req.on('end', () => {
                // 在 str 中存放的时完整的请求体数据
                console.log(str)
                
                //4、把字符串格式的请求体数据,解析成对象格式
                const body = qs.parse(str)
                console.log(body)
                
                //5、将解析出来的请求对象,挂载为 req.body
                req.body = body
                next()
            })
        })
        
        app.post('/user', (req, res) => {
            res.send('ok')
        })
        
        app.listen(80, ()=> {
            console.log('express 服务器运行在 http://127.0.0.1.80')
        })
    复制代码
  • Encapsule el middleware personalizado como módulos

    Para optimizar la estructura del código, las funciones de middleware personalizadas se pueden encapsular en módulos independientes

    • Cree un módulo personalizado llamado custom-body-parser, extraiga las funciones de middleware previamente personalizadas y module.exportsexpórtelas

      //导入处理 querystring 的 node.js 内置模块
      const qs = require('querystring')
      
      const bodyParser = (req, res, next) => {
          let str = ''
      
          req.on('data', (chunk)=>{
              str += chunk
          })
      
          req.on('end', () => {
              console.log(str)
              const body = qs.parse(str)
              console.log(body)
              req.body = body
              next()
          })
      }
      
      module.exports = bodyParser
      复制代码
    • llamada externa. Importe módulos personalizados y regístrese como middleware disponible globalmente

      const express = require('express')
      const app = express()
      
      // 1、导入自己封装的中间件模块
      const customBodyParse = require('./custom-body-parser')
      
      // 2、将自定义的中间件函数,注册为全局可用的中间件
      app.use(customBodyParse)
      
      app.post('/user', (req, res) => {
          res.send(req.body)
      })
      
      
      app.listen(80, ()=> {
          console.log('express 服务器运行在 http://127.0.0.1.80')
      })
      复制代码

Supongo que te gusta

Origin juejin.im/post/7084972172183076872
Recomendado
Clasificación