2012-10-04 11 views
36

パラメータを受け入れることができるミドルウェアを作成しようとしています。これはどうすればできますか?パラメータを受け入れるexpressjsミドルウェアの作成

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

}) 

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

    next(); 
} 
+0

ハ、あなたは私の正確なシナリオのための私の正確な質問をしますが、6年前にしました。とても素晴らしいです。 – aero

答えて

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

私も、私は同じ機能の複数のコピー作成しないことを確認するには:あなたが持っていない場合、代わりに

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

私のために働く!明確な例をありがとう。 – facultymatt

+0

シンプルでエレガント。非常に素晴らしい。 –

+6

2番目のメソッドは、パラメータをキャッシュします。 –

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

良いと簡単な考え。ミドルウェアは本当に単なる正常な機能です。それに他の値を渡すのはなぜでしょうか。最初の関数にreq、res、nextを含めてください。 – zevero

+0

コードはしばしば自分自身で話しますが、コードに説明を追加するとよいでしょう。これは、レビュー専用のキューにポップアップされました。コード専用の回答が多いようです。 – Will

2

をあまりにも多くの場合、またはロールが文字列でない場合:

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

あなたは、さまざまな権限レベルを持っている場合は、このようにそれらを構造化することができます:

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(); 
    } 
} 
関連する問題