/ लॉगिन के लिए सभी मार्ग को पकड़ें


85

मैं वर्तमान में एक एपीआई लिख रहा हूं जिसके लिए उपयोगकर्ता को प्रत्येक अनुरोध के शीर्षलेख में प्रमाणीकरण टोकन पारित करने की आवश्यकता होगी। अब मुझे पता है कि मैं एक कैथोलिक मार्ग कह सकता हूं

app.get('/*', function(req,res){

});

लेकिन मैं सोच रहा था कि मैं इसे कैसे बनाऊं ताकि यह कुछ मार्गों को शामिल न करे जैसे /loginया /?


1
जैसे / लॉगिन और रजिस्टर को छोड़कर सभी मार्गों पर प्रमाणीकरण की आवश्यकता है । (चूंकि लोग सोच रहे हैं कि आपने यह सवाल क्यों पूछा)
a20

जवाबों:


127

मुझे यकीन नहीं है कि जब उपयोगकर्ता पहुंचता है /loginया आप क्या चाहते हैं /, लेकिन आप उन लोगों के लिए अलग मार्ग बना सकते हैं; यदि आप कैच-ऑल से पहले उन्हें घोषित करते हैं, तो उन्हें आने वाले अनुरोधों को संभालने में पहले dibs मिलते हैं:

app.get('/login', function(req, res) {
  ...
});

app.get('/', function(req, res) {
  ...
});

app.get('*', function(req, res) {
  ...
});

1
यह केवल "GET" के अधिकार के लिए काम करेगा? किसी कारण से मुझे यह उत्तर काम करने के लिए app.use(अन्य विधियों को शामिल करने के लिए) नहीं मिल सकता है ।
SSH

4
@SSHThis मुझे लगता है कि एक्सप्रेस (v4) के सबसे हालिया संस्करण के साथ-साथ app.use('*', ...)काम भी करना चाहिए। लेकिन app.all('*', ...)इस मामले में उपयोग करना बेहतर है।
रॉबर्टबेल्प

@JulienMartin सिर्फ परीक्षण किया है, लगता है जैसे कि यह काम करता है के साथ एक्सप्रेस v4.16.3 अपेक्षा के अनुरूप
robertklep

app.useमिडलवेयर जोड़ता है, जो डिज़ाइन द्वारा श्रृंखला में अगले हैंडलर के लिए अनुरोध पर पारित होता है (अतिरिक्त तर्क का उपयोग करके next)।
स्टिजन डे विट

45

आप हमेशा कैच-ऑल रूट को रख सकते हैं, जिन्हें आप बाहर करना चाहते हैं ( robertklep उत्तर देखें )।

लेकिन कभी-कभी आप अपने मार्गों के क्रम की परवाह नहीं करना चाहते हैं। इस मामले में आप अभी भी वही कर सकते हैं जो आप चाहते हैं:

app.get('*', function(req, res, next) {
  if (req.url === '/' || req.url === '/login') return next();
  ...
});

1
.get ('*', फंक्शन (req, res, next)।
ओलिवर डिक्सन

2
@iLoveUnicorns thanx! आपने सिर्फ मेरी पोस्ट को संपादित क्यों नहीं किया?
लियोनिद बेस्चस्टानी

यदि अन्य नियम उस एक से पहले हैं, तो क्या इसे अगले कॉल करने की आवश्यकता है?
सैंडबर्ग

1
@ सैंडबर्ग मिडलवेयर को या तो next()अगले मिडलवेयर को निष्पादन पास करना चाहिए , या अनुरोध को पूरा करने के लिए कुछ प्रतिक्रिया भेजनी चाहिए। अन्यथा अनुरोध लटका रहेगा। यदि स्टैक में अंतिम मिडलवेयर कहा जाता है next()तो एक्सप्रेस डिफ़ॉल्ट "404 नॉट फाउंड" प्रतिक्रिया भेज देगा। next()उदाहरण के लिए, आपको कॉल res.status(400).end()करने के बजाय , "400 बैड रिक्वेस्ट" प्रतिक्रिया के साथ अनुरोध को पूरा करने के लिए कॉल करें ।
लियोनिद बेस्चस्टानी

24

यदि आप प्रत्येक अनुरोध में क्रेडेंशियल या प्रामाणिकता को मान्य करना चाहते हैं, तो आपको एक्सप्रेस रूटिंग सुविधा "ऑल" का उपयोग करना चाहिए, आप इस तरह का उपयोग कर सकते हैं:

app.all('/api/*', function(req, res, next){
    console.log('General Validations');
    next();
});

आप इसे किसी भी रूटिंग सामान से पहले रख सकते हैं।

ध्यान दें कि इस मामले में मैंने पथ के रूप में "/ api / " का उपयोग किया था, आप "/ " का उपयोग कर सकते हैं यह आपकी आवश्यकताओं के अनुरूप है।

आशा है कि यहाँ किसी की मदद करने में देर नहीं होगी।


10

कैच-ऑल रूट हैंडलर बनाने का एक और तरीका यह है:

app.get('/login', function(req, res) {
  //... login page
});
app.get('/', function(req, res) {
  //...index page
});
app.get('/:pageCalled', function(req, res) {
  console.log('retrieving page: ' + req.params.pageCalled);
  //... mypage.html
});

यह बिल्कुल रॉबर्टबेल्प के (स्वीकृत) उत्तर की तरह काम करता है, लेकिन यह आपको इस बारे में अधिक जानकारी देता है कि उपयोगकर्ता वास्तव में क्या अनुरोध करता है। अब आपके पास req.params.pageCalledजो कुछ भी पृष्ठ का अनुरोध किया जा रहा है उसका प्रतिनिधित्व करने के लिए एक स्लग है और यदि आप कई अलग-अलग हैं, तो उपयोगकर्ता को उपयुक्त पृष्ठ पर निर्देशित कर सकते हैं।

इस दृष्टिकोण के साथ देखने के लिए एक गटच्या (thx @agmin), /:pageCalledकेवल एकल के साथ मार्गों को पकड़ेगा /, इसलिए आपको नहीं मिलेगा /route/1, आदि। अतिरिक्त /:pageCalled/:subPageCalledपृष्ठों जैसे thx @softcode) के लिए अतिरिक्त स्लग का उपयोग करें


बेहतर? वास्तव में? क्या आप परिस्थितियों को निर्धारित नहीं करते हैं? ;-) असंबंधित: लोगों को एक टिप्पणी छोड़ने के बिना downvoting: कैसे असभ्य!
पर्ट्का

15
इस दृष्टिकोण के साथ एक बहुत बड़ा गोटीया है, /:pageCalledकेवल एक एकल के साथ मार्गों को //route/1
पकड़ेंगे

इसके अलावा, यदि आप इसे एक कोशिश में नहीं घेरते हैं / पकड़ते हैं तो आपको एक त्रुटि मिलेगी यदि वह पृष्ठ मौजूद नहीं है।
darethas

@agmin तो समाधान बस जोड़ने के लिए नहीं होगा /:pageCalled/:subPageCalledआदि?
सॉफ्टकोड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.