2012-10-04 26 views
36

Próbuję utworzyć oprogramowanie pośredniczące, które może akceptować parametry. Jak to zrobić?Tworzenie oprogramowania pośredniego expressjs akceptującego parametry

przykład

app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){ 

}) 

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

    next(); 
} 
+0

Ha, ty zapytał mój dokładny pytanie do mojego dokładnego scenariusza, ale 6 lat wcześniej. SO jest niesamowite. – aero

Odpowiedz

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

Chcę również, aby upewnić się, że nie robią wiele kopii tej samej funkcji:

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

Działa dla mnie! Dzięki za wyraźny przykład. – facultymatt

+0

Prosty i elegancki. Bardzo dobrze. –

+6

Druga metoda buforuje parametry, które mogą być pożądane lub nie. –

0
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(); 
}; 
+0

Dobry i prosty pomysł. Oprogramowanie pośredniczące jest po prostu normalną funkcją. Dlaczego nie przekazać do niego innych wartości. Proszę podać polecenie req, res i następne w pierwszej funkcji. – zevero

+0

Podczas gdy kod często mówi sam za siebie, dobrze jest dodać pewne wyjaśnienie do kodu. Pojawiło się to w kolejce do przeglądu, ponieważ zwykle pojawiają się odpowiedzi tylko na kod. – Will

2

Alternatywnie, jeśli nie masz za dużo przypadków lub rola NIE jest łańcuchem:

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){ 

}) 
1

Jeśli mają różne poziomy z uprawnieniami można uporządkowania ich tak:

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(); 
    } 
} 
Powiązane problemy