2012-06-30 25 views
9

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.Alcance de las funciones de middleware en express.js

Digamos que tenemos esta code

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); 
}); 

Desde andRestrictTo (papel) devuelve un middleware, es conseguir ejecutado en la cadena de conducción - Tengo que. Sin embargo:

  1. ¿De dónde provienen los parámetros siguientes, res, next 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 un poco 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 podría señalar la idea básica :)

Respuesta

9

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

2) Cuando se eleva el error (en realidad no elevó, pero pasa a), la función next le lleva al controlador de errores, que se puede definir usando error método de app, por ejemplo (tomado de Express documentation) :

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

el aumento de error breakes una cadena de middleware y le lleva a la cadena de controladores de errores (como se puede ver, se utiliza en next controladores de errores también).

3) no es difícil en absoluto:

security.js

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

app.js

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

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

2) No se ha producido ningún error (solo una declaración 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 apropiadamente.

3) Acababas pones en un módulo que exporta andRestrict (si fuera la función sólo externamente utilizable en el módulo, lo haces con exports=andRestrict y luego se lo debe invocar con require('mymodule')); de lo contrario, configurarí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).

Cuestiones relacionadas