2012-10-04 12 views
36

पैरामीटर स्वीकार करते हुए एक एक्सप्रेसज मिडलवेयर बनाना मैं पैरामीटर स्वीकार कर सकता हूं जो एक मिडलवेयर बनाने की कोशिश कर रहा हूं। यह कैसे किया जा सकता है?पैरामीटर

उदाहरण

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

दूसरी विधि कैश पैरामीटर, जो वांछित व्यवहार नहीं हो सकता है या नहीं। –

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