2012-10-16 20 views
38

मैं कुछ मिडलवेयर कार्यों के साथ Node.js में एक्सप्रेस ढांचे का उपयोग कर रहा छोड़कर सभी रास्तों के लिए एक्सप्रेस में मिडलवेयर मिडलवेयर केवल विशिष्ट पथ पर:उपयोग विशिष्ट एक विशिष्ट एक

app.use('/userdata', User.checkUser); 

यह इतना है कि मिडलवेयर, किसी एक को छोड़कर सभी रास्तों के लिए प्रयोग किया जाता है रूट पथ यानी पथ चर का उपयोग करना संभव है?

मैं कुछ के बारे में इस तरह सोच रहा हूँ:

app.use('!/', User.checkUser); 

तो User.checkUser हमेशा रूट पथ के अलावा कहा जाता है।

उत्तर

57

मैं होमपेज को छोड़कर, मेरे सभी पथों में चेकयूसर मिडलवेयर जोड़ूंगा।

app.get('/', routes.index); 
app.get('/account', checkUser, routes.account); 

या

app.all('*', checkUser); 

function checkUser(req, res, next) { 
    if (req.path == '/') return next(); 

    //authenticate user 
    next(); 
} 

आप अंडरस्कोर के साथ इस का विस्तार कर सकता है गैर-प्रमाणीकृत रास्तों की एक सरणी में req.path के लिए खोज करने के लिए:

function checkUser(req, res, next) { 
    var _ = require('underscore') 
     , nonSecurePaths = ['/', '/about', '/contact']; 

    if (_.contains(nonSecurePaths, req.path)) return next(); 

    //authenticate user 
    next(); 
} 
+1

धन्यवाद, मैंने अंडरस्कोर समाधान लागू किया। – Thomas

+0

क्या सभी अनुरोधों को किसी विशिष्ट पथ पर अनुमति देना संभव है, लेकिन उप-पथ नहीं? (यानी '/', '/style.css', '/background.jpg', लेकिन '/ सूचियां /' या '/ शीर्षक' नहीं) – Thomas

+0

आपकी स्थैतिक संपत्तियों को स्थिर निर्देशिका से बाहर किया जाना चाहिए। – chovy

7
इसके बजाय सीधे User.checkUser मिडलवेयर के रूप में पंजीकरण के

, रजिस्टर एक नई सहायक समारोह, checkUserFilter कहते हैं, हर यूआरएल पर बुलाया जाता है कि है, लेकिन केवल दिए गए यूआरएल पर userFiled` के निष्पादन पारित कर दिया। उदाहरण:

var checkUserFilter = function(req, res, next) { 
    if(req._parsedUrl.pathname === '/') { 
     next(); 
    } else { 
     User.checkUser(req, res, next); 
    } 
} 

app.use(checkUserFilter); 

सिद्धांत रूप में, आप app.use कराने के लिए regexp पथ प्रदान कर सकता है। उदाहरण के लिए कुछ:

app.use(/^\/.+$/, checkUser); 

एक्सप्रेस 3.0.0rc5 पर इसका प्रयास किया, लेकिन यह काम नहीं करता है।

शायद हम open a new ticket कर सकते हैं और इसे एक सुविधा के रूप में सुझाव दे सकते हैं?

1

उपयोग

app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){... 

यह किसी भी यूआरएल को अलग करता है f रोम /। जब तक, यह मेरे लिए काम नहीं करता है।

सामान्य

/^(\/path.+|(?!\/path).*)$/ 

में (How to negate specific word in regex? देखें)

आशा इस मदद करता है

4

तुम भी मिडलवेयर एक-एक मार्ग निर्धारित कर सकते हैं।

// create application/x-www-form-urlencoded parser 
var urlencodedParser = bodyParser.urlencoded({ extended: false }) 

// POST /login gets urlencoded bodies 
app.post('/login', urlencodedParser, function (req, res) { 
    if (!req.body) return res.sendStatus(400) 
    res.send('welcome, ' + req.body.username) 
}) 
+1

यही वह है जिसे मैं ढूंढ रहा हूं !! – Lancelot

संबंधित मुद्दे