template node jade how create crear node.js scope express connect middleware

node.js - jade - node js express template



Alcance de las funciones de middleware en express.js (2)

Estoy aprendiendo express.js / node.js y tengo una buena pero no excelente comprensión del modelo de prototipo de JavaScript. Por lo tanto, estoy un poco confundido sobre la forma en que el middleware se puede apilar en los mecanismos de enrutamiento de express.js.

Digamos que tenemos este código

function andRestrictTo(role) { return function(req, res, next) { req.authenticatedUser.role == role ? next() : next(new Error(''Unauthorized'')); } } app.del(''/user/:id'', loadUser, andRestrictTo(''admin''), function(req, res){ res.send(''Deleted user '' + req.user.name); });

Como andRestrictTo (role) devuelve un middleware, se ejecuta en la cadena de enrutamiento. Lo tengo. Sin embargo:

  1. ¿De dónde provienen los parámetros próximos, res, siguientes en la función devuelta? Supongo que la "cadena" de alguna manera lo está poniendo en cola y confirma los parámetros, pero esto es demasiado vago para una comprensión más profunda ...

  2. ¿Qué está pasando con el error que se plantea como el siguiente parámetro? ¿Un error simplemente rompe la cadena de middleware?

  3. Si quisiera empaquetar el mecanismo de restricción en un archivo / módulo separado (como un marco de seguridad), ¿cómo se haría eso?

Sería genial si alguien pudiera señalar la idea básica :)


1) req y res provienen de la misma fuente de Express JS, es decir, Node.JS http.createServer handler (ambas variables se modifican un poco antes de llegar realmente al controlador Express). En ese punto, Express mantiene la matriz de todas las rutas y aplica las funciones de req , res y next para cada ruta. next función sabe en qué middleware estamos en este momento (debido a algunos trucos de alcance) y lo llama así: next() lleva al siguiente controlador.

2) Cuando se produce el error (en realidad no se genera , pero se pasa a), la next función lo lleva al controlador de errores, que puede definir utilizando el método de error de la app , por ejemplo (tomado de la documentación de Express ):

app.error(function(err, req, res, next){ if (err instanceof NotFound) { res.render(''404.jade''); } else { next(err); } });

El aumento de error rompe una cadena de middlewares y lo lleva a la cadena de manejadores de errores (como puede ver, también usa el next en manejadores de errores).

3) No es nada difícil:

security.js

module.exports = function(req, res, next) { console.log(''Security middleware!''); next(); }

app.js

app.get(''/'', require(''./security''), ...);


1) El código de enrutamiento de Express (en realidad, Connect) toma una solicitud HTTP y comienza a pasarla a todas las funciones de middleware, llamando a cada una de ellas con la req y res que vino junto con la solicitud, y agregando una next que invoca la parte del código de enrutamiento que pasa el control a la siguiente función de middleware en la cadena.

2) No se ha producido ningún error (solo una declaración de throw puede generar un error). El código de enrutamiento reconoce que una función de middleware ha devuelto un objeto Error , y se ocupa de eso de manera apropiada.

3) Simplemente lo pondría en un módulo que exporta y andRestrict (si fuera la única función externamente utilizable en el módulo, establecería exports=andRestrict y exports=andRestrict y luego lo invocaría con require(''mymodule'') ); de lo contrario, establecería exports.andRestrict=<body of your function> y lo invocaría en dos pasos: mymodule=require(''mymodule'') desde el principio y mymodule.andRestrict más tarde (por ejemplo, al pasarlo como middleware)).