2012-09-21 7 views
70

के साथ अनुरोध पथ कैसे प्राप्त करें मैं एक्सप्रेस + node.js का उपयोग कर रहा हूं और मेरे पास एक req ऑब्जेक्ट है, ब्राउज़र में अनुरोध/खाता है, लेकिन जब मैं req.path लॉग करता हूं तो मुझे '/' मिलता है - - नहीं 'खाता'।एक्सप्रेस रिक ऑब्जेक्ट

//auth required or redirect 
    app.use('/account', function(req, res, next) { 
    console.log(req.path); 
    if (!req.session.user) { 
     res.redirect('/login?ref='+req.path); 
    } else { 
     next(); 
    } 
    }); 

req.path/कब होना चाहिए/खाता ??

+3

कोशिश 'req.route.path' – vinayr

+2

' लेखन त्रुटि: संपत्ति पढ़ा नहीं जा सकता undefined' – chovy

+0

req.route.path की 'पथ' सही और दस्तावेज [यहाँ है ] (http://expressjs.com/api.html#req.route)। आप किस संस्करण का उपयोग कर रहे हैं? – zemirco

उत्तर

116

एक अपने आप को खेलने का एक सा होने के बाद, आप का उपयोग करना चाहिए:

console.log(req.originalUrl)

+0

अभी भी स्पष्ट नहीं है कि req.path क्यों काम नहीं करता है। – chovy

+3

मुझे लगता है कि इसे मिडलवेयर की स्थिति के साथ कुछ करने के लिए मिला है, लेकिन आप सही हैं, यह समझ में नहीं आता है। – Menztrual

+1

यह निश्चित रूप से मिडलवेयर है। यह एक्सप्रेस 4 में अतिरिक्त राउटर के साथ भी होता है। जब किसी दिए गए पथ से या तो घुमाया जाता है, तो अपने आप में यह दिखाता है कि यह रूट से बाहर है। यह अलगाव के लिए अच्छा है, लेकिन मुश्किल है जब आप नहीं जानते कि मूल पूर्ण मूल्य क्या प्राप्त किया जाए। इसे पोस्ट करने के लिए धन्यवाद! – juanpaco

8

यह होना चाहिए:

req.url

एक्सप्रेस 3.1.x

32

कुछ मामलों में आपको इसका उपयोग करना चाहिए:

req.path 

यह आपको पूर्ण अनुरोधित URL के बजाय पथ देता है। उदाहरण के लिए, आप केवल जो पेज में उपयोगकर्ता का अनुरोध किया और रुचि रखते हैं नहीं तो मानकों के सभी प्रकार यूआरएल:

/myurl.htm?allkinds&ofparameters=true 

req.path आप दे देंगे:

/myurl.html 
+0

सावधान रहें कि यदि आप इस यूआरएल के खिलाफ चेक कर रहे हैं तो एक ट्रेलिंग स्लैश के लिए चेक भी शामिल करें यदि यह आपके ऐप में मान्य है। (यानी '/ डेमो 'की जांच करना संभावित रूप से'/डेमो/'के लिए जांचना चाहिए)। – Vinay

9

तुम सच में प्राप्त करना चाहते हैं क्वेरीस्ट्रिंग के बिना केवल "पथ", आप पार्स करने के लिए url लाइब्रेरी का उपयोग कर सकते हैं और यूआरएल का केवल पथ भाग प्राप्त कर सकते हैं।

var url = require('url'); 

//auth required or redirect 
app.use('/account', function(req, res, next) { 
    var path = url.parse(req.url).pathname; 
    if (!req.session.user) { 
     res.redirect('/login?ref='+path); 
    } else { 
     next(); 
    } 
}); 
+0

यह वही है जो मैं चाहता हूं। लॉगिन सफल होने पर '' 'req.query.ref''' के साथ इसका उपयोग करें –

+0

यह सार्वभौमिक कोड के साथ अच्छी तरह से काम करता है क्योंकि यह [स्थान] (https://developer.mozilla.org/en-US/docs/Web/ एपीआई/स्थान) कल्पना। क्लाइंट और सर्वर पर इकाई परीक्षण के लिए याद रखने के लिए कम चीजें और आसान। – cchamberlain

3

req.route.path is working for me

var pool = require('../db'); 

module.exports.get_plants = function(req, res) { 
    // to run a query we can acquire a client from the pool, 
    // run a query on the client, and then return the client to the pool 
    pool.connect(function(err, client, done) { 
     if (err) { 
      return console.error('error fetching client from pool', err); 
     } 
     client.query('SELECT * FROM plants', function(err, result) { 
      //call `done()` to release the client back to the pool 
      done(); 
      if (err) { 
       return console.error('error running query', err); 
      } 
      console.log('A call to route: %s', req.route.path + '\nRequest type: ' + req.method.toLowerCase()); 
      res.json(result); 
     }); 
    }); 
}; 

को क्रियान्वित करने के बाद मैं कंसोल में निम्नलिखित देख सकते हैं और मैं अपने ब्राउज़र में सही परिणाम मिलता है।

Express server listening on port 3000 in development mode 
A call to route: /plants 
Request type: get 
5
//auth required or redirect 
app.use('/account', function(req, res, next) { 
    console.log(req.path); 
    if (!req.session.user) { 
    res.redirect('/login?ref='+req.path); 
    } else { 
    next(); 
    } 
}); 

req.path is/when it should be /account ??

इस का कारण यह है कि एक्सप्रेस पथ अपने हैंडलर समारोह पर रखा गया है, जो इस मामले में '/account' है घटा देती है।

वे ऐसा क्यों करते हैं?

क्योंकि यह हैंडलर फ़ंक्शन का पुन: उपयोग करना आसान बनाता है। आप एक हैंडलर समारोह है कि उदाहरण के लिए req.path === '/' और req.path === '/goodbye' के लिए अलग अलग बातें करता है बना सकते हैं:

function sendGreeting(req, res, next) { 
    res.send(req.path == '/goodbye' ? 'Farewell!' : 'Hello there!') 
} 

तो आप एक से अधिक अंतिम बिंदुओं को यह माउंट कर सकते हैं:

app.use('/world', sendGreeting) 
app.use('/aliens', sendGreeting) 

देता है:

/world   ==> Hello there! 
/world/goodbye ==> Farewell! 
/aliens   ==> Hello there! 
/aliens/goodbye ==> Farewell! 
0
res.redirect(req.header('referrer')); 

वर्तमान यूआरएल पते पर रीडायरेक्ट करेगा।

0

संस्करण 4 के लिए।x अब आप पूर्ण पथ प्राप्त करने के लिए req.path के अतिरिक्त req.baseUrl का उपयोग कर सकते हैं। उदाहरण के लिए, ओपी अब कुछ की तरह करना होगा:

//auth required or redirect 
app.use('/account', function(req, res, next) { 
    console.log(req.baseUrl + req.path); // => /account 

    if(!req.session.user) { 
    res.redirect('/login?ref=' + encodeURIComponent(req.baseUrl + req.path)); // => /login?ref=%2Faccount 
    } else { 
    next(); 
    } 
});