एक्सप्रेस अनुरोध ऑब्जेक्ट के साथ अनुरोध पथ कैसे प्राप्त करें


158

मैं एक्सप्रेस + नोड.जेएस का उपयोग कर रहा हूं और मेरे पास एक 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 है / कब होना चाहिए / खाता है ??


2
TypeError: Cannot read property 'path' of undefined
चॉवी

req.route.path यहाँ सही और प्रलेखित है । आप किस संस्करण का उपयोग कर रहे हैं?
ज़मीरको

मैं एक ही मुद्दा रहा हूँ। req.routeअपरिभाषित है। Im 3.4.4 एक्सप्रेस का उपयोग कर। मार्ग के अपरिभाषित होने का क्या कारण हो सकता है?
davidpfahler

@vinayr req.route.path अभी भी / quizzes / create के बजाय मुझे / create देता है, जो कि पूरा URL है
Sandip Subedi

यह अभिप्रेत व्यवहार है। और आपको इसे गले लगाना चाहिए। आपके हैंडलर को पूरे रास्ते की परवाह नहीं करनी चाहिए, लेकिन केवल रास्ते के 'स्थानीय' हिस्से के बारे में। यह उस पथ के बाद का हिस्सा है जिस पर इसे लगाया गया था। यह हैंडलर फ़ंक्शन को अन्य संदर्भों में पुन: उपयोग करने के लिए अधिक आसान बनाता है।
स्टिजिन डे विट

जवाबों:


234

थोड़ा सा नाटक करने के बाद, आपको इसका उपयोग करना चाहिए:

console.log(req.originalUrl)


3
मुझे लगता है कि इसके मिडलवेयर की स्थिति के साथ कुछ किया गया है, लेकिन आप सही हैं, इसका कोई मतलब नहीं है।
मेनट्रूज़ल

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

3
4.0 पर यहां आने वाला कोई भी व्यक्ति, req.url को री-रूटिंग उद्देश्यों के लिए मिडलवेयर द्वारा म्यूट करने के लिए डिज़ाइन किया गया है, और जहाँ इसे कहा जाता है, उसके आधार पर req.path लापता बढ़ते बिंदु हो सकता है। expressjs.com/en/api.html#req.originalUrl
क्रिश्चियन डेविस

3
यदि आप क्वेरी स्ट्रिंग शामिल नहीं करना चाहते हैं:const path = req.originalUrl.replace(/\?.*$/, '');
एडम रीस

1
चेतावनी: यह एक भ्रामक उत्तर है, जो ओपी प्रश्न पर आधारित है। यदि यह मौजूद था, तो यह क्वेरी स्ट्रिंग (जैसे = a = b & c = 5) भी लौटाएगा। एक्सप्रेसजेज्स
सिआब्रोस

60

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

req.path

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

/myurl.htm?allkinds&ofparameters=true

req.path आपको देगा:

/myurl.html

1
सावधान रहें कि यदि आप इस URL के खिलाफ चेक कर रहे हैं, तो यह आपके ऐप में मान्य होने पर अनुगामी स्लैश के लिए चेक भी शामिल कर सकता है। (यानी के लिए जाँच /demoभी संभावित रूप से जाँच करनी चाहिए /demo/)।
विनय

यदि आप क्वेरी स्ट्रिंग शामिल नहीं करना चाहते हैं: const path = req.originalUrl.replace (/\?.*$/, '');
एडम रीस

req.pathका आशुलिपि है url.parse(req.url).pathnameऔर यह स्वीकृत उत्तर होना चाहिए
१at:

1
@sertsedat गलत है। req.pathआपको वह सापेक्ष पथ देता है जहां आपका ऐप माउंट किया गया है। यह जड़ में रखा जाता है, तो की तुलना में इस सही है, लेकिन एक पथ के लिए /my/path, अंदर किसी एप्लिकेशन पर घुड़सवार /my, req.urlदे देंगे /path
स्टिजेन डे विट

21

पूरक करने के लिए, यहाँ एक उदाहरण दिया गया है जो दस्तावेज़ीकरण से विस्तृत है, जो अच्छी तरह से सभी को लपेटता है, एक्सप्रेस के साथ सभी मामलों में पथ / URL तक पहुँचने के बारे में जानना आवश्यक है:

app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?a=b'
  console.dir(req.originalUrl) // '/admin/new?a=b' (WARNING: beware query string)
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  console.dir(req.baseUrl + req.path) // '/admin/new' (full path without query string)
  next()
})

इसके आधार पर: https://expressjs.com/en/api.html#req.originalUrl

निष्कर्ष: जैसा कि c1moore के उत्तर में ऊपर बताया गया है, उपयोग करें:

var fullPath = req.baseUrl + req.path;


9
//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 है / कब होना चाहिए / खाता है ??

इसका कारण यह है कि एक्सप्रेस आपके हैंडलर फ़ंक्शन को उस पथ पर घटाता है जो '/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!

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

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

यह सार्वभौमिक कोड के साथ अच्छी तरह से काम करता है क्योंकि यह स्थान कल्पना के अनुरूप है । क्लाइंट और सर्वर पर यूनिट टेस्ट को याद रखने और आसान करने के लिए कम चीजें।
cchamberlain

req.pathके लिए सिर्फ एक उपनाम हैurl.parse(req.url).pathname
22:43

8

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

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

5

req.route.path मेरे लिए काम कर रहा है

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.