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:
¿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 ...
¿Qué está pasando con el error que se plantea como el siguiente parámetro? ¿Un error simplemente rompe la cadena de middleware?
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)).