node.js - data - middleware node js
¿Qué significa middleware y app.use realmente en Expressjs? (8)
===== Explicación muy, muy simple =====
Los middlewares se utilizan a menudo en el contexto del marco Express.js y son un concepto fundamental para node.js. En pocas palabras, es básicamente una función que tiene acceso a los objetos de solicitud y respuesta de su aplicación. La forma en que me gustaría pensarlo es en una serie de "chequeos / pre-pantallas" por los que pasa la solicitud antes de que sea manejada por la aplicación. Por ejemplo, Middlewares sería una buena opción para determinar si la solicitud se autentica antes de proceder a la aplicación y devolver la página de inicio de sesión si la solicitud no se autentica o para registrar cada solicitud. Una gran cantidad de middlewares de terceros están disponibles que permiten una variedad de funcionalidades.
Ejemplo simple de middleware:
var app = express();
app.use(function(req,res,next)){
console.log("Request URL - "req.url);
next();
}
El código anterior se ejecutaría para cada solicitud que ingrese y registraría la url de la solicitud; el método next () esencialmente permite que el programa continúe. Si la función next () no se invoca, el programa no continuará y se detendrá en la ejecución del middleware.
Un par de Middleware Gotchas:
- El orden de los middlewares en su aplicación es importante, ya que la solicitud iría a través de cada uno en un orden secuencial.
- Olvidarse de llamar al método next () en su función de middleware puede detener el procesamiento de su solicitud.
- Cualquier cambio en los objetos requeridos y resueltos en la función de middleware, haría que el cambio esté disponible para otras partes de la aplicación que usan requisitos y res.
Casi todas las aplicaciones Express que veo tienen una declaración app.use
para middleware, pero no he encontrado una explicación clara y concisa de qué middleware es realmente y qué hace la declaración app.use
. Incluso los documentos expresos en sí mismos son un poco vagos en esto. ¿Me puedes explicar estos conceptos por favor?
Agrego una respuesta tardía para agregar algo que no se menciona en las respuestas anteriores.
A estas alturas, debe quedar claro que el middleware es una función o funciones que se ejecutan entre la solicitud del cliente y la respuesta del servidor . La funcionalidad de middleware más común que se necesita es la gestión de errores, la interacción de bases de datos, la obtención de información de archivos estáticos u otros recursos. Para moverse en la pila de middleware se debe llamar a la siguiente devolución de llamada, puede verla al final de la función de middleware para pasar al siguiente paso en el flujo.
Puede utilizar el enfoque app.use
y tener un flujo como este :
var express = require(''express''),
app = express.createServer(),
port = 1337;
function middleHandler(req, res, next) {
console.log("execute middle ware");
next();
}
app.use(function (req, res, next) {
console.log("first middle ware");
next();
});
app.use(function (req, res, next) {
console.log("second middle ware");
next();
});
app.get(''/'', middleHandler, function (req, res) {
console.log("end middleware function");
res.send("page render finished");
});
app.listen(port);
console.log(''start server'');
pero también puede utilizar otro enfoque y pasar cada middleware como argumentos de función. Este es un ejemplo del sitio web de MooTools Nodejs donde midleware obtiene el flujo de Twitter, Github y Blog antes de que la response
se envíe de vuelta al cliente. Observe cómo las funciones se pasan como argumentos en app.get(''/'', githubEvents, twitter, getLatestBlog, function(req, res){
. El uso de app.get
solo se llamará para las solicitudes GET, se app.use
todas las peticiones
// github, twitter & blog feeds
var githubEvents = require(''./middleware/githubEvents'')({
org: ''mootools''
});
var twitter = require(''./middleware/twitter'')();
var blogData = require(''./blog/data'');
function getLatestBlog(req, res, next){
blogData.get(function(err, blog) {
if (err) next(err);
res.locals.lastBlogPost = blog.posts[0];
next();
});
}
// home
app.get(''/'', githubEvents, twitter, getLatestBlog, function(req, res){
res.render(''index'', {
title: ''MooTools'',
site: ''mootools'',
lastBlogPost: res.locals.lastBlogPost,
tweetFeed: res.locals.twitter
});
});
Después de simplificar las cosas, un servidor web puede verse como una función que toma una solicitud y genera una respuesta. Entonces, si ve un servidor web como una función, puede organizarlo en varias partes y separarlas en funciones más pequeñas para que la composición de ellas sea la función original.
Middlewares son las funciones más pequeñas que puede componer con otros y el beneficio obvio es que puede reutilizarlos.
La guide ExpressJs tiene una respuesta bastante clara a su pregunta, le recomiendo que lea esto, estoy publicando un breve fragmento de la guía, la guía es bastante buena.
Escribir middleware para su uso en aplicaciones Express
Visión general
Las funciones de middleware son funciones que tienen acceso al objeto de solicitud ( req ), al objeto de respuesta ( res ) y a la siguiente función en el ciclo de solicitud-respuesta de la aplicación. La siguiente función es una función en el enrutador Express que, cuando se invoca, ejecuta el middleware y el middleware actual.
Las funciones de middleware pueden realizar las siguientes tareas:
- Ejecutar cualquier código.
- Realizar cambios en la solicitud y en los objetos de respuesta.
- Finaliza el ciclo de solicitud-respuesta.
- Llame al siguiente middleware en la pila.
Si la función de middleware actual no finaliza el ciclo de solicitud-respuesta, debe llamar a next () para pasar el control a la siguiente función de middleware. De lo contrario, la solicitud quedará colgada.
Ejemplo
Aquí hay un ejemplo de una aplicación simple "Hello World" Express. El resto de este artículo definirá y agregará dos funciones de middleware a la aplicación: una llamada myLogger que imprime un mensaje de registro simple y otra llamada requestTime 1 que muestra la marca de tiempo de la solicitud HTTP.
var express = require(''express'')
var app = express()
app.get(''/'', function (req, res) {
res.send(''Hello World!'')
})
app.listen(3000)
Función de middleware myLogger
Aquí hay un ejemplo simple de una función de middleware llamada "myLogger". Esta función simplemente imprime "LOGGED" cuando una solicitud a la aplicación pasa a través de ella. La función de middleware se asigna a una variable llamada myLogger.
var myLogger = function (req, res, next) {
console.log(''LOGGED'')
next()
}
Observe la llamada de arriba al siguiente () . Llamar a esta función invoca la siguiente función de middleware en la aplicación. La función next () no es parte de Node.js o Express API, pero es el tercer argumento que se pasa a la función de middleware. La función next () podría tener cualquier nombre, pero por convención siempre se llama "next". Para evitar confusiones, utiliza siempre esta convención.
Para cargar la función de middleware, llame a app.use () , especificando la función de middleware. Por ejemplo, el siguiente código carga la función de middleware myLogger antes de la ruta a la ruta raíz (/).
var express = require(''express'')
var app = express()
var myLogger = function (req, res, next) {
console.log(''LOGGED'')
next()
}
app.use(myLogger)
app.get(''/'', function (req, res) {
res.send(''Hello World!'')
})
app.listen(3000)
Cada vez que la aplicación recibe una solicitud, imprime el mensaje "LOGGED" en el terminal.
El orden de carga del middleware es importante: las funciones de middleware que se cargan primero también se ejecutan primero.
Si myLogger se carga después de la ruta a la ruta raíz, la solicitud nunca llega y la aplicación no imprime "LOGGED", porque el controlador de ruta de la ruta raíz termina el ciclo de solicitud-respuesta.
La función de middleware myLogger simplemente imprime un mensaje, luego pasa la solicitud a la siguiente función de middleware en la pila llamando a la función next () .
- Esta publicación solo contendrá el middleware myLogger; para más publicación, puede consultar la guía original de ExpressJs guide .
Middleware es un subconjunto de funciones encadenadas llamadas por la capa de enrutamiento Express js antes de invocar el controlador definido por el usuario. Las funciones de middleware tienen acceso completo a los objetos de solicitud y respuesta y pueden modificar cualquiera de ellos.
La cadena de middleware siempre se llama en el orden exacto en que se ha definido, por lo que es vital para usted saber exactamente qué está haciendo una pieza específica de middleware.
Una vez que una función de middleware finaliza, llama a la siguiente función de la cadena invocando su siguiente argumento como función.
Una vez que se ejecuta la cadena completa, se llama al manejador de solicitudes del usuario.
Middlewares son funciones ejecutadas en el medio después de que la entrada / fuente produce una salida que podría ser la salida final o podría ser utilizada por el siguiente middleware hasta que se complete el ciclo.
Es como un producto que pasa por una línea de ensamblaje donde se modifica a medida que avanza hasta que se completa, evalúa o se rechaza.
Un middleware espera que funcione algún valor (es decir, valores de parámetros) y, en función de alguna lógica, el middleware llamará o no llamará al siguiente middleware o enviará una respuesta al cliente.
Si aún no puede captar el concepto de middleware, es de una manera similar a los patrones de Decorator o Chain of command.
Estoy a medio camino de separar el concepto de middleware en un nuevo proyecto.
Middleware le permite definir una pila de acciones por las que debe fluir. Los servidores Express en sí mismos son una pila de middlewares.
// express
var app = express();
// middleware
var stack = middleware();
Luego puede agregar capas a la pila de middleware llamando a .use
// express
app.use(express.static(..));
// middleware
stack.use(function(data, next) {
next();
});
Una capa en la pila de middleware es una función que toma n parámetros (2 para express, req
& res
) y una función next
.
Middleware espera que la capa realice algunos cálculos, aumente los parámetros y luego llame al next
.
Una pila no hace nada a menos que lo manejes. Express manejará la pila cada vez que se detecte una solicitud HTTP entrante en el servidor. Con middleware manejas la pila manualmente.
// express, you need to do nothing
// middleware
stack.handle(someData);
Un ejemplo más completo:
var middleware = require("../src/middleware.js");
var stack = middleware(function(data, next) {
data.foo = data.data*2;
next();
}, function(data, next) {
setTimeout(function() {
data.async = true;
next();
}, 100)
}, function(data) {
console.log(data);
});
stack.handle({
"data": 42
})
En términos expresos, simplemente define una pila de operaciones que desea que Express maneje para cada solicitud HTTP entrante.
En términos de Express (en lugar de conectarse), tiene middleware global y middleware específico de ruta. Esto significa que puede adjuntar una pila de middleware a cada solicitud HTTP entrante o solo adjuntarla a las solicitudes HTTP que interactúan con una determinada ruta.
Ejemplos avanzados de express y middleware:
// middleware
var stack = middleware(function(req, res, next) {
users.getAll(function(err, users) {
if (err) next(err);
req.users = users;
next();
});
}, function(req, res, next) {
posts.getAll(function(err, posts) {
if (err) next(err);
req.posts = posts;
next();
})
}, function(req, res, next) {
req.posts.forEach(function(post) {
post.user = req.users[post.userId];
});
res.render("blog/posts", {
"posts": req.posts
});
});
var app = express.createServer();
app.get("/posts", function(req, res) {
stack.handle(req, res);
});
// express
var app = express.createServer();
app.get("/posts", [
function(req, res, next) {
users.getAll(function(err, users) {
if (err) next(err);
req.users = users;
next();
});
}, function(req, res, next) {
posts.getAll(function(err, posts) {
if (err) next(err);
req.posts = posts;
next();
})
}, function(req, res, next) {
req.posts.forEach(function(post) {
post.user = req.users[post.userId];
});
res.render("blog/posts", {
"posts": req.posts
});
}
], function(req, res) {
stack.handle(req, res);
});
¡Mantén las cosas simples, hombre!
Nota: la respuesta está relacionada con los casos de software intermedio integrados de ExpressJS, sin embargo, existen diferentes definiciones y casos de uso de middlewares.
Desde mi punto de vista, el middleware actúa como una utilidad o funciones auxiliares, pero su activación y uso es completamente opcional mediante el uso de app.use(''path'', /* define or use builtin middleware */)
que no queremos de nosotros escriba un código para realizar tareas muy comunes que son necesarias para cada solicitud HTTP de nuestro cliente, como el procesamiento de cookies, tokens CSRF y ..., que son muy comunes en la mayoría de las aplicaciones, por lo que el middleware puede ayudarnos a hacer todo esto para cada solicitud HTTP de nuestro El cliente en alguna pila, secuencia o orden de operaciones luego proporciona el resultado del proceso como una sola unidad de solicitud del cliente .
Ejemplo:
La naturaleza de la tecnología de servidor web es aceptar las solicitudes de los clientes y proporcionarles respuestas de vuelta de acuerdo con sus solicitudes.
Imagínese si estamos proporcionando una respuesta con solo "¡Hola, mundo!" el texto para una solicitud GET HTTP a la URI raíz de nuestro servidor web es un escenario muy simple y no necesita nada más, sino que si estamos verificando al usuario que ha iniciado sesión y respondemos con "¡Hola, nombre de usuario!" necesita algo más de lo habitual en este caso, necesitamos un middleware para procesar todos los metadatos de solicitud del cliente y proporcionarnos la información de identificación obtenida de la solicitud del cliente, de acuerdo con esa información podemos identificar de forma única a nuestro usuario actual y es posible responderle. / ella con algunos datos relacionados.
Espero que ayude a alguien!