cara mendapatkan jalur permintaan dengan objek req ekspres

158

Saya menggunakan express + node.js dan saya memiliki objek req, permintaan di browser adalah / akun tetapi ketika saya login req.path saya mendapatkan '/' --- bukan '/ akun'.

  //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 adalah / kapan seharusnya / akun ??

kenyal
sumber
2
TypeError: Cannot read property 'path' of undefined
chovy
req.route.path benar dan didokumentasikan di sini . Versi ekspres mana yang Anda gunakan?
zemirco
Saya mengalami masalah yang sama. req.routetidak terdefinisi. Saya menggunakan express 3.4.4. Apa yang bisa menyebabkan rute menjadi tidak terdefinisi?
davidpfahler
@vinayr req.route.path masih memberi saya / buat alih-alih / quiz / buat, yang merupakan keseluruhan URL
Sandip Subedi
Ini adalah perilaku yang dimaksudkan. Dan Anda harus menerimanya. Pawang Anda seharusnya tidak peduli dengan path lengkap, tetapi hanya tentang bagian 'lokal' dari path. Itu bagian setelah jalan itu dipasang. Ini membuat fungsi handler lebih mudah digunakan kembali dalam konteks lain.
Stijn de Witt

Jawaban:

234

Setelah bermain sendiri, Anda harus menggunakan:

console.log(req.originalUrl)

Menztrual
sumber
3
Saya pikir itu ada hubungannya dengan posisi middleware, tetapi Anda benar, itu tidak masuk akal.
Menztrual
1
Ini pasti middleware. Ini terjadi dengan router tambahan di Express 4 juga. Ketika salah satu dipasang dari jalur yang diberikan, di dalam dirinya sendiri itu bisa berpura-pura bahwa itu keluar dari root. Itu bagus untuk isolasi, tetapi sulit ketika Anda tidak tahu bagaimana mendapatkan nilai penuh aslinya. Terima kasih telah memposting ini!
juanpaco
3
Siapa pun yang datang ke sini pada 4.0, req.url dirancang untuk bisa diubah oleh middleware untuk keperluan perutean ulang, dan req.path bisa kehilangan titik pemasangan tergantung pada tempat namanya. expressjs.com/en/api.html#req.originalUrl
Christian Davis
3
Jika Anda tidak ingin string kueri disertakan:const path = req.originalUrl.replace(/\?.*$/, '');
Adam Reis
1
Peringatan: Ini adalah jawaban yang menyesatkan, berdasarkan pada pertanyaan OP. Ini juga akan mengembalikan string kueri (misalnya? A = b & c = 5) jika ada. Lihat expressjs.com/en/api.html#req.originalUrl
Ciabaros
60

Dalam beberapa kasus, Anda harus menggunakan:

req.path

Ini memberi Anda jalan, alih-alih URL yang diminta lengkap. Misalnya, jika Anda hanya tertarik pada halaman mana yang diminta pengguna dan tidak semua jenis parameter, url:

/myurl.htm?allkinds&ofparameters=true

req.path akan memberi Anda:

/myurl.html
DivZero
sumber
1
Berhati-hatilah jika Anda melakukan pemeriksaan terhadap URL ini untuk juga menyertakan cek untuk garis miring jika valid di aplikasi Anda. (yaitu memeriksa /demojuga berpotensi memeriksa /demo/).
Vinay
Jika Anda tidak ingin string kueri disertakan: const path = req.originalUrl.replace (/\?.*$/, '');
Adam Reis
req.pathadalah singkatan dari url.parse(req.url).pathnamedan ini harus menjadi jawaban yang diterima
sertsedat
1
@sertsedat Salah. req.pathmemberi Anda jalur relatif ke tempat aplikasi Anda dipasang. Jika dipasang di root daripada ini benar, tetapi untuk jalur /my/path, di dalam aplikasi yang dipasang di /my, req.urlakan memberikan /path.
Stijn de Witt
21

Untuk melengkapi, berikut adalah contoh yang diperluas dari dokumentasi, yang dengan baik membungkus semua yang perlu Anda ketahui tentang mengakses jalur / URL dalam semua kasus dengan ekspres:

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

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

Kesimpulan: Seperti yang dinyatakan oleh jawaban c1moore di atas, gunakan:

var fullPath = req.baseUrl + req.path;
Ciabaros
sumber
11

Harus:

req.url

mengekspresikan 3.1.x

Jürgen Paul
sumber
req.url bukan properti Express asli, itu diwarisi dari modul http Node: expressjs.com/en/api.html#req.originalUrl
Megagator
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 adalah / kapan seharusnya / akun ??

Alasan untuk ini adalah bahwa Express mengurangi path tempat fungsi handler Anda dipasang, yang '/account'dalam hal ini.

Mengapa mereka melakukan ini?

Karena itu membuatnya lebih mudah untuk menggunakan kembali fungsi handler. Anda dapat membuat fungsi penangan yang melakukan hal-hal yang berbeda untuk req.path === '/'dan req.path === '/goodbye'misalnya:

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

Kemudian Anda bisa memasangnya ke beberapa titik akhir:

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

Memberi:

/world           ==>  Hello there!
/world/goodbye   ==>  Farewell!
/aliens          ==>  Hello there!
/aliens/goodbye  ==>  Farewell!
Stijn de Witt
sumber
9

Jika Anda ingin benar-benar hanya mendapatkan "path" tanpa querystring, Anda dapat menggunakan urllibrary untuk menguraikan dan mendapatkan hanya path bagian dari 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();
    }
});
Murat Çorlu
sumber
inilah tepatnya yang saya inginkan. Gunakan dengan req.query.refjika login berhasil
Ryan Wu
Ini berfungsi baik dengan kode universal karena sesuai dengan spesifikasi Lokasi . Lebih sedikit hal yang perlu diingat dan lebih mudah untuk menguji unit di klien dan server.
cchamberlain
req.path hanyalah alias untuk url.parse(req.url).pathname
mhodges
8

Untuk versi 4.x Anda sekarang dapat menggunakan req.baseUrlselain req.pathuntuk mendapatkan path lengkap. Misalnya, OP sekarang akan melakukan sesuatu seperti:

//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();
  }
});
Lebih baik
sumber
5

req.route.path bekerja untuk saya

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

setelah mengeksekusi saya melihat yang berikut di konsol dan saya mendapatkan hasil yang sempurna di browser saya.

Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
Bahman
sumber