Creando un middleware expressjs que acepte parámetros.

Estoy tratando de crear un middleware que pueda aceptar parámetros. ¿Cómo se puede hacer esto?

ejemplo

app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){ }) HasRole = function(role, req, res, next){ if(role != user.role){ res.redirect('/NotInRole); } next(); } 

 function HasRole(role) { return function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); } } 

También quiero asegurarme de no hacer copias múltiples de la misma función:

 function HasRole(role) { return HasRole[role] || (HasRole[role] = function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); }) } 

Alternativamente, si no tiene demasiados casos o si el rol NO es una cadena:

 function HasRole(role) { return function(req, res, next) { if (role !== req.user.role) res.redirect(...); else next(); }) } var middlware_hasRoleAdmin = HasRole('admin'); //define router only once app.get('/hasToBeAdmin', middlware_hasRoleAdmin, function(req,res){ }) 
 app.get('/hasToBeAdmin', function(req, res, next){ hasRole(req, res, next, 'admin'); }, function(req,res){ // regular route }); var hasRole = function(req, res, next, role){ if(role != user.role){ res.redirect('/NotInRole'); } next(); }; 

Si tienes varios niveles de permisos, podrías estructurarlos así:

 const LEVELS = Object.freeze({ basic: 1, pro: 2, admin: 3 }); /** * Check if user has the required permission level */ module.exports = (role) => { return (req, res, next) => { if (LEVELS[req.user.role] < LEVELS[role]) return res.status(401).end(); return next(); } }