El principio del middleware express (app.use ())

1. ¿Qué es el middleware?

El middleware es un método de procesamiento de solicitudes, que distribuye todo el proceso del usuario desde la solicitud hasta la respuesta a múltiples middleware para su procesamiento, con el objetivo de mejorar la flexibilidad del código y ser expandible dinámicamente. La comprensión simple es: filtrar las solicitudes recibidas capa por capa.

2. Middleware en express

El proceso de procesamiento de solicitudes es: después de que el servidor recibe la solicitud, si el servidor escribe varios middleware, se emparejará en secuencia hasta que el middleware que cumpla con los requisitos coincida y luego se procese. Cabe señalar que el middleware a través de la misma solicitud es el mismo objeto de solicitud y el mismo objeto de respuesta

Clasificación de middleware:

  1. Middleware a nivel de aplicación

    • Coincidencia completa (no le importa ninguna ruta de solicitud y método de solicitud, cuando el usuario lo solicita, si se distribuye al middleware, procesará directamente la operación de solicitud)

      app.use(function (req,res,next) {
              
              
        console.log('全匹配');
        next();
      })
      

      Cuando la solicitud pasa a través de este middleware, no se preocupa por la ruta y el método de la solicitud, y entra directamente en el middleware para su procesamiento. Entre ellos se nextencuentra un método para llamar al siguiente middleware elegible . Si no escribe next, permanecerá en el middleware actual y no coincidirá con otros middleware.

    • Coincide con el /xx/comienzo de la ruta (coincidencia aproximada)

      app.use('/a',function (req,res,next) {
              
              
        console.log(3333);
      })
      

      Solo /a/la ruta que comienza con se puede emparejar y procesar correctamente, por ejemplo: /a/bse puede emparejar correctamente, pero no /ab/bse puede emparejar correctamente

  2. Middleware de nivel de enrutamiento (coincidencia exacta)

    Debe ser coherente con la ruta de la solicitud y el método de solicitud para que coincida correctamente

    app.get('/a',(req,res) => {
          
          
      console.log(1111);
      res.send('index.html');
    })
    

Siguiente uso:

  • Sin parámetros

Consulte los siguientes escenarios:

app.use(function (req,res,next) {
    
    
  console.log('全匹配');
  next();
})

app.use('/a',function (req,res,next) {
    
    
  console.log(3333);
  next();
})

app.get('/a',(req,res) => {
    
    
  console.log(1111);
  res.render('index.html');
})

app.get('/',(req,res) => {
    
    
  console.log('2222');
  res.render('index.html',{
    
    
    name: 'chen'
  })
})

app.get('/',(req,res) => {
    
    
  console.log('44444');
})

El navegador ingresa la URL 127.0.0.1:3000/y recorre cada middleware a su vez, y coincide con el primer middleware completamente coincidente. Después de imprimir 全匹配, se llama nexty luego continúa coincidiendo con el middleware que cumple con los requisitos, y el segundo middleware completamente coincidente no se cumple. a /a/la ruta que comienza con el pase directo, la tercera coincidencia para continuar, porque es una coincidencia exacta, todavía no coincide, cuando se enfrenta con el último middleware, la coincidencia es exitosa, 2222se puede ver la salida que nextlas condiciones siempre han estado buscando para El navegador solicita el objeto, es decir, debe cumplir con 127.0.0.1:3000/esta solicitud.

Aquí hay otra escena:

app.get('/a',(req,res,next) => {
    
    
  console.log(1111);
  next();
})
app.get('/a',(req,res) => {
    
    
  res.send('ok');
})

Cuando se accede /a, coincide con la salida del primer middleware 1111, lo encuentra next, coincide con el segundo middleware y vuelve al cliente ok. Se puede ver que el middleware de coincidencia de solicitudes es un proceso de coincidencia uno por uno, en lugar de que el último cubra el antiguo proceso.

  • Con parámetros

    app.use(function (req,res,next) {
          
          
      console.log('全匹配');
      let err = '出错了';
      next(err);
    })
    
    app.use('/a',function (req,res,next) {
          
          
      console.log(3333);
      next();
    })
    
    # 带有四个参数,且这四个参数必须写全
    app.use(function (err,req,res,next) {
          
          
      console.log(err);// 出错了
    })
    

    Al acceder a la /aruta, si el primer middleware coincide, el siguiente se encuentra y tiene parámetros, no coincidirá con otros middlewares e irá directamente al middleware con cuatro parámetros para hacer coincidir, que se pueden utilizar para el manejo unificado de respuestas de error.

El principio de uso de complementos de terceros:

Debido a que el middleware por el que pasa la misma solicitud es el mismo objeto de solicitud y el mismo objeto de respuesta , cuando un middleware agrega otro contenido al objeto de solicitud, otro middleware que coincida correctamente puede acceder a este nuevo contenido.

# 访问'/'
app.use(function (req,res,next) {
    
    
  console.log(111);
  req.body = {
    
    
    name: 'chen'
  }
  next()
})

app.use('/',function (req,res,next) {
    
    
  console.log(req.body.name);// chen
})

El código anterior muestra que cuando el primer middleware coincide, el atributo body se agrega al objeto de solicitud y, luego, cuando se llama al segundo middleware coincidente, se puede acceder al contenido del nuevo atributo. De esta manera, el complemento de terceros modifica el objeto de solicitud y devuelve el contenido correspondiente. Al acceder a otro middleware, puede acceder al nuevo contenido del complemento de terceros, como por ejemplo: body-parsercomplemento

# 假设已经下载好了body-parser插件
# 引入包
const bodyParser = require('body-parser');
# 将body-parser函数作为参数传递到app.use中
app.use(bodyParser.urlencoded({
    
    extended: false}));
app.use(bodyParser.json());

app.get('/',(req,res)=> {
    
    
    console.log(req.body);
})

Cuando bodyParser se pasa al middleware como una función, en este momento se realizarán operaciones como agregar el atributo body al objeto de solicitud. Una vez completada la adición, se debe llamar nexty luego continuar haciendo coincidir el siguiente middleware. En este momento tiempo, puede estar en el middleware coincidente exacto. Utilice el atributo body.

A partir de la serie anterior de procesos de uso, se puede ver que el orden de escritura del middleware aún afecta la respuesta de la solicitud.

3. Resumen

El middleware se utiliza como un medio para filtrar las solicitudes. Entre ellos, el middleware en express se basa principalmente en next para conectar varios middleware. Al mismo tiempo, debido a que el middleware a través de la misma solicitud es el mismo objeto de solicitud y el mismo objeto de respuesta , genera más La comunicación se puede realizar entre dos middleware.

Aplicación práctica:

  • Utilice middleware para configurar complementos según las necesidades
  • Procesar la solicitud después de filtrar la solicitud unificada
  • Se pueden realizar operaciones de procesamiento unificadas para respuestas de error

Supongo que te gusta

Origin blog.csdn.net/chen__cheng/article/details/115072038
Recomendado
Clasificación