hızlı req nesnesi ile istek yolu almak nasıl


158

Express + node.js kullanıyorum ve bir req nesnesi var, tarayıcıda istek / hesap ama req.path giriş yaptığımda '/' --- '/ account' değil.

  //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 / hesap ne zaman olmalıdır?


2
TypeError: Cannot read property 'path' of undefined
chovy

req.route.path doğrudur ve burada belgelenmiştir . Hangi express sürümünü kullanıyorsunuz?
zemirco

Aynı sorunu yaşıyorum. req.routetanımsız. Ekspres kullanıyorum 3.4.4. Rotanın tanımlanmamasına ne sebep olabilir?
davidpfahler

@vinayr req.route.path hala / quizzes / create yerine bana tüm URL'yi veriyor
Sandip Subedi

Bu amaçlanan davranıştır. Ve onu kucaklamalısın. İşleyiciniz tam yolu değil, yalnızca yolun 'yerel' bölümünü önemsemelidir. Bu, üzerine monte edildiği yoldan sonraki kısım. Bu, işleyici işlevinin diğer bağlamlarda yeniden kullanımını daha kolay hale getirir.
Stijn de Witt

Yanıtlar:


234

Biraz oyun oynadıktan sonra şunları kullanmalısınız:

console.log(req.originalUrl)


3
Bence ara katman yazılımı konumlandırma ile ilgili bir şey var, ama haklısın, mantıklı değil.
Menztrual

1
Kesinlikle ara katman yazılımı. Bu, Express 4'teki ek yönlendiricilerde de olur. Her ikisi de belirli bir yoldan monte edildiğinde, kendi içinde kökünden kopmuş gibi davranır. Bu izolasyon için güzel, ancak orijinal tam değerin ne olduğunu nasıl bilmediğinizde zor. Bunu gönderdiğiniz için teşekkürler!
juanpaco

3
4.0, req.url buraya gelen herkes yeniden yönlendirme amacıyla ara katman yazılımı tarafından değiştirilebilir olması için tasarlanmıştır ve req.path nerede denir bağlı olarak montaj noktaları eksik olabilir. expressjs.com/en/api.html#req.originalUrl
Christian Davis

3
Sorgu dizesinin dahil edilmesini istemiyorsanız:const path = req.originalUrl.replace(/\?.*$/, '');
Adam Reis

1
Uyarı: Bu, OP sorusuna dayanan yanıltıcı bir cevaptır. Bu, varsa sorgu dizesini de (ör.? A = b & c = 5) döndürür. Bkz. Expressjs.com/en/api.html#req.originalUrl
Ciabaros

61

Bazı durumlarda şunları kullanmalısınız:

req.path

Bu size istenen URL'nin tamamı yerine yol verir. Örneğin, yalnızca kullanıcının istediği sayfayla ilgileniyorsanız ve URL'nin her türlü parametresi ile ilgilenmiyorsanız:

/myurl.htm?allkinds&ofparameters=true

req.path size şunları verecektir:

/myurl.html

1
Bu URL'ye karşı kontroller yapıyorsanız, uygulamanızda geçerliyse sondaki eğik çizgi için bir kontrol de içermesine dikkat edin. (yani kontrol etmek /demode potansiyel olarak kontrol etmelidir /demo/).
Vinay

Sorgu dizesinin dahil edilmesini istemiyorsanız: const path = req.originalUrl.replace (/\?.*$/, '');
Adam Reis

req.pathstenografi url.parse(req.url).pathnameve bu kabul edilen cevap olmalı
sertsedat

1
@sertsedat Yanlış. req.pathsize uygulamanızın bağlı olduğu göreli yolu verir. O kökünde monte edilirse bu doğrudur, ama bir yolu için daha /my/path, bir uygulama monte dahilinde /my, req.urlverecektir /path.
Stijn de Witt

22

Eklemek için, dokümanlarda genişletilmiş bir örnek, tüm durumlarda yollara / URL'lere erişim ile ilgili bilmeniz gereken her şeyi güzel bir şekilde sarar:

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

Dayalı: https://expressjs.com/en/api.html#req.originalUrl

Sonuç: Yukarıdaki c1moore'un cevap durumları olarak şunu kullanın:

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 / hesap ne zaman olmalıdır?

Bunun nedeni, Express'in işleyici işlevinizin bağlı olduğu yolu çıkarmasıdır '/account', bu durumda.

Bunu neden yapıyorlar?

Çünkü işleyici işlevinin yeniden kullanımını kolaylaştırır. Örneğin , farklı şeyler yapan bir işleyici işlevi yapabilirsiniz req.path === '/'ve req.path === '/goodbye'örneğin:

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

Ardından birden fazla uç noktaya monte edebilirsiniz:

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

Giving:

/world           ==>  Hello there!
/world/goodbye   ==>  Farewell!
/aliens          ==>  Hello there!
/aliens/goodbye  ==>  Farewell!

9

Querystring olmadan gerçekten sadece "yol" almak istiyorsanız, url'nin urlyalnızca yol kısmını ayrıştırmak ve almak için kütüphaneyi kullanabilirsiniz .

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

tam olarak istediğim bu. req.query.refGiriş başarılı olursa kullanın
Ryan Wu

Bu, Location spesifikasyonuna uygun olduğu için evrensel kodla iyi çalışır . Hatırlanması gereken daha az şey ve istemci ve sunucu genelinde birim testi daha kolay.
cchamberlain

req.pathsadece bir takma adurl.parse(req.url).pathname
mhodges

8

Versiyon 4.x için artık kullanabilirsiniz req.baseUrlek olarak req.pathtam yolunu alır. Örneğin, OP şimdi şöyle bir şey yapacaktır:

//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 benim için çalışıyor

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

çalıştırdıktan sonra konsolda aşağıdakileri görüyorum ve tarayıcımda mükemmel sonuç elde ediyorum.

Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.