NodeJS / Express: ¿qué es "app.use"?

332

En los documentos para el expressmódulo NodeJS , el código de ejemplo tiene app.use(...).

¿Cuál es la usefunción y dónde se define?

Alexander Bird
fuente
55
posible duplicado: stackoverflow.com/questions/7337572/…
Alexander Bird
Este tipo de preguntas se pueden responder leyendo la documentación.
Mina
47
la documentación es un poco críptica para un principiante
KansaiRobot
66
Posible duplicado anterior es hacer referencia entre sí
Afrig Aminuddin
1
La documentación no está completamente clara
Tessaracter

Respuestas:

370

El objeto de la aplicación se instancia en la creación del servidor Express. Tiene una pila de middleware que se puede personalizar app.configure()(ahora está en desuso en la versión 4.x) .

Para configurar su middleware, puede invocar app.use(<specific_middleware_layer_here>)para cada capa de middleware que desee agregar (puede ser genérico para todas las rutas o desencadenarse solo en rutas específicas que maneja su servidor), y se agregará a su pila de middleware Express . Las capas de middleware se pueden agregar una por una en múltiples invocaciones use, o incluso todas a la vez en serie con una sola invocación. Ver usedocumentación para más detalles.

Para dar un ejemplo de comprensión conceptual de Express Middleware, así es como se ve la pila de middleware de mi aplicación (app.stack) cuando registro mi objeto de aplicación en la consola como JSON:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

Como puede deducir, llamé app.use(express.bodyParser()), app.use(express.cookieParser())etc., que agregó estas 'capas' de middleware express a la pila de middleware. Observe que las rutas están en blanco, lo que significa que cuando agregué esas capas de middleware especifiqué que se activarían en cualquier ruta. Si agrego una capa de middleware personalizada que solo se activa en la ruta /user/:idque se reflejaría como una cadena en el routecampo de ese objeto de capa de middleware en la impresión de la pila anterior.

Cada capa está esencialmente agregando una función que maneja específicamente algo a su flujo a través del middleware.

Por ejemplo, al agregar bodyParser, se asegura de que su servidor maneja las solicitudes entrantes a través del middleware express . Entonces, ahora analizar el cuerpo de las solicitudes entrantes es parte del procedimiento que su middleware lleva a cabo cuando maneja las solicitudes entrantes , todo porque usted llamó app.use(bodyParser).

chinnychinchin
fuente
116
gracias. ¿Sería tan difícil para la gente express explicar esto en sus documentos de API?
ericsoco
44
Entonces, dice que cuando se recibe una solicitud, los datos se pasan a través de esos analizadores antes de acceder al servicio real. Entonces, por ejemplo: Solicitud válida-> Autenticación-> Solicitud de procesos-> ServResponse USE ¿controlaría esos pasos en un orden específico y no los ejecutaría en paralelo?
Adam Hess
2
Entonces, ¿la inyección de dependencia app.use () está en acción?
Kevin C.
8
¿Cuándo se llama a la función que se envía a app.use? ¿Después de crear el servidor express o para cada solicitud?
Timo Huovinen
55
@KevinC. No, no es inyección de dependencia. Es una arquitectura de plugin. En general, este tipo de arquitectura se denomina sistema de filtro / tubería de filtro / tubería y filtro. En Express, la tubería es la next()devolución de llamada que se espera que cada middleware llame para pasar el procesamiento a la siguiente función de la tubería. El sistema de enrutamiento (el primer argumento app.use()) permite que la tubería de rama en función de URL
slebetman
50

usees un método para configurar el middleware utilizado por las rutas del objeto del servidor HTTP Express. El método se define como parte de Connect en el que se basa Express.

Actualización A partir de la versión 4.x, Express ya no depende de Connect .

Las funciones de middleware que se incluían anteriormente con Express ahora están en módulos separados; Vea la lista de funciones de middleware .

JohnnyHK
fuente
3
Y los documentos en línea están aquí: senchalabs.org/connect/proto.html#app.use
Alexander Bird
¿Sería eficiente si un middleware Node instanciara objetos? ¿Significaría esto que en cada solicitud, ese middleware crea instancias de nuevos objetos? ¿Se descartan los objetos viejos? Por ejemploapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai
1
@CMCDragonkai Está bien crear instancias de objetos en cada solicitud. Obtendrán basura recolectada siempre que no esté almacenando referencias a los objetos fuera del alcance de su controlador de solicitudes.
jeff_mcmahan
1
@AlexanderBird thx para los enlaces (aunque el primero está roto ahora). Para el registro, solo el comienzo del documento en el segundo enlace dice "Utilizar el identificador de middleware dado para la ruta dada, por defecto a /. Esta" ruta "es el punto de montaje para el middleware, cuando se le da un valor distinto de / el middleware solo es efectivo cuando ese segmento está presente en el nombre de ruta de la solicitud. Por ejemplo, si montáramos una función en / admin, se invocaría en / admin y / admin / settings, sin embargo no se invocaría para / , o / posts ". Simple :)
Adrien Be
40

Se llama a cada app.use (middleware) cada vez que se envía una solicitud al servidor.

Tyrese
fuente
77
La respuesta de una sola oración es instantáneamente comprensible y más útil que las otras explicaciones de varios párrafos.
stackedAndOverflowed
16

app.use () utilizado para montar la función de middleware o montar en una ruta especificada, la función de middleware se ejecuta cuando la ruta base coincide.

Por ejemplo: si está usando app.use () en indexRouter.js, así:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

En el código anterior app.use () monta la ruta en '/ ads' a adsRouter.js.

Ahora en adsRouter.js

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

en adsRouter.js, la ruta será así para ads- '/ ads / show', y luego funcionará de acuerdo con controllerIndex.ads.showAd ().

app.use ([ruta], callback, [callback]): podemos agregar una devolución de llamada en el mismo.

app.use('/test', function(req, res, next) {

  // write your callback code here.

    });
Shubham Verma
fuente
Usaría "mapa" en lugar de "monte", más fácil de entender.
Jeb50
13

app.use () actúa como un middleware en aplicaciones express. A diferencia de app.get () y app.post () más o menos, en realidad puede usar app.use () sin especificar la URL de solicitud. En tal caso, lo que hace es que se ejecute cada vez sin importar qué URL haya sido golpeada.

Omkar Mote
fuente
7

app.use () funciona así:

  1. Evento de solicitud generado en la instancia del servidor http del nodo.
  2. express realiza parte de su manipulación interna con el objeto req.
  3. Esto es cuando express comienza a hacer las cosas que especificó con app.use

Que muy simple.

Y solo entonces express hará el resto de las cosas como enrutamiento.

Anton Stafeyev
fuente
6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use es una forma de registrar middleware o cadena de middlewares (o múltiples middlewares) antes de ejecutar cualquier lógica de ruta final o lógica de ruta intermedia, dependiendo del orden de la secuencia de registro de middleware.

Middleware: forma una cadena de funciones / middleware-funciones con 3 parámetros req, res y next . El siguiente es la devolución de llamada que se refiere a la siguiente función de middleware en cadena y, en el caso de la última función de middleware de cadena, los siguientes puntos a la función de primer middleware de la siguiente cadena de middlerare registrada.

JackOfAshes - Mohit Gawande
fuente
1
Funciona de maravilla !!
Anmol Rai
3

En express si importamos express de "express" y usamos app = express (); entonces la aplicación tiene todas las funcionalidades de express

si usamos app.use ()

con cualquier función de módulo / middleware para usar en todo el proyecto express

saurabh kumar
fuente
3

app.useEs una función que requiere middleware. Por ejemplo:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

Este ejemplo muestra la función de middleware instalada en la /user/:idruta. Esta función se ejecuta para cualquier tipo de solicitud HTTP en la /user/:idruta.

Es similar al servidor web REST, solo use diferentes /xxpara representar diferentes acciones.

Hongnan Yan
fuente
gracias por la respuesta, pero como alguien más ya dijo toda esa información, no votaré esta. No creo que necesite todas las explicaciones de lo que usepuede hacer express ; Solo necesitaba saber que era eso (y cualquier conocimiento de contexto para saber cómo investigar más yo mismo).
Alexander Bird
3

app.use es woks como middleware para la solicitud de la aplicación. sintaxis

app.use('pass request format',function which contain request response onject)

ejemplo

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

también puede usarlo en caso de enrutar su solicitud.

app.use('/', roting_object);
Chetan Wate
fuente
2

Middleware es un término general para el software que sirve para "unirse", por lo que app.use es un método para configurar el middleware, por ejemplo: para analizar y manejar el cuerpo de la solicitud: app.use (bodyParser.urlencoded ({extended: true })); app.use (bodyParser.json ()); hay muchos middlewares que puedes usar en tu aplicación express solo lee el documento: http://expressjs.com/en/guide/using-middleware.html

usuario3432221
fuente
2

app.use aplica el middleware especificado a la pila de middleware de la aplicación principal. Al adjuntar middleware a la pila principal de aplicaciones, el orden de los archivos adjuntos es importante; si conecta el middleware A antes del middleware B, el middleware A siempre se ejecutará primero. Puede especificar una ruta para la que sea aplicable un middleware particular. En el siguiente ejemplo, "hola mundo" siempre se registrará antes de "felices fiestas".

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})
Rubin Bhandari
fuente
2

Le permite usar cualquier middleware ( leer más ) body_parser, CORSetc. El middleware puede hacer cambios requesty responseobjetos. También puede ejecutar un fragmento de código.

Binayak Gouri Shankar
fuente
Gracias por la respuesta, pero creo que toda esa información ya está capturada en otras respuestas
Alexander Bird,
2

También puede crear su propia función de middleware como

app.use( function(req, res, next) {
  // your code 
  next();
})

Contiene tres parámetros req, res, next
También se puede utilizar para la autenticación y validación de los parametros de entrada para mantener su controlador limpio.

next()se usa para ir al siguiente middleware o ruta.
Puedes enviar la respuesta desde el middleware

Ashvin Ahjolia
fuente
1

Enlace el middleware de nivel de aplicación a una instancia del objeto de la aplicación mediante las funciones app.use () y app.METHOD (), donde METHOD es el método HTTP de la solicitud que maneja la función de middleware (como GET, PUT o POST) en minúsculas.

Rajeev Kumar Verma
fuente
1

En resumen, app.use () admite todo tipo de solicitudes [por ejemplo: get, post, ...] por lo que se usa principalmente para configurar middelware. o puede usarse para cuando las rutas y funciones se separan

ejemplo:

app.use("/test",functionName)

y functionName se encuentra en un archivo diferente

Snivio
fuente
Gracias por la respuesta, pero creo que toda esa información ya está capturada en otras respuestas.
Alexander Bird
1

app.use() Es un método de middleware.

El método de middleware es como un interceptor en java, este método siempre se ejecuta para todas las solicitudes.

Propósito y uso de middleware: -

  1. Para verificar si la sesión expiró o no
  2. para autenticación y autorización de usuarios
  3. verificar cookies (fecha de caducidad)
  4. analizar datos antes de la respuesta
Mohan
fuente
El middleware es la función que se pasa a app.use ().
NattyC
1

app.use
es creado por express (framework de middleware de nodejs)
app.use se usa para ejecutar cualquier consulta específica en el proceso de
intilización server.js (nodo)
var app = require ('express'); entonces la función básicamente app.use se llama cada vez que el servidor está activo
app.use(bodyparser.json())

Piyush Jain
fuente
0

app.use es middleware de nivel de aplicación

Enlace el middleware de nivel de aplicación a una instancia del objeto de la aplicación mediante las funciones app.use () y app.METHOD (), donde METHOD es el método HTTP de la solicitud que maneja la función de middleware (como GET, PUT o POST) en minúsculas.

puede usar para verificar todas las solicitudes, por ejemplo, desea verificar el token / token de acceso que necesita para escribir un middleware usando app.use para verificar el token en la solicitud.

Este ejemplo muestra una función de middleware sin ruta de montaje. La función se ejecuta cada vez que la aplicación recibe una solicitud.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

referencia de https://expressjs.com/en/guide/using-middleware.html

Osama Bari
fuente
app.use () no es middleware. Middleware es la función pasada a app.use ()
NattyC
0

app.use (ruta, middleware) se usa para llamar a la función de middleware que debe llamarse antes de que la ruta llegue a la ruta correspondiente. Se pueden invocar múltiples funciones de middleware a través de un app.use.

app.use ('/ fetch', enforceAuthentication) -> enforceAuthentication middleware fn se llamará cuandose recibauna solicitud que comience con '/ fetch' . Puede ser / fetch / users , / fetch / ids / {id} , etc.

Es posible que algunas funciones de middleware tengan que llamarse independientemente de la solicitud. Para tales casos, no se especifica una ruta, y dado que la ruta predeterminada es / y cada solicitud comienza con / , esta función de middleware se llamará para todas las solicitudes.

app.use (() => {// Inicializar un servicio común})

next () fn necesita ser llamado dentro de cada función de middleware cuando se pasan múltiples funciones de middleware a app.use , de lo contrario no se llamará a la siguiente función de middleware.

referencia: http://expressjs.com/en/api.html#app.use

Nota: La documentación dice que podemos omitir las funciones de middleware que siguen a la actual llamando a next ('route') dentro de la función de middleware actual, pero esta técnica no funcionó para mí dentro de app.use pero sí funcionó con app.METHOD como a continuación . Entonces, se llamaron fn1 y fn2 pero no fn3.

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
usuario3022150
fuente