Hoe u een aanvraagpad krijgt met Express REQ-object

Ik gebruik Express + Node.js en ik heb een REQ-object, het verzoek in de browser is / account, maar wanneer ik Log REQ.Path, krijg ik ‘/’ — niet ‘/account’.

 //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 / wanneer het zou moeten zijn / account ??


1, Autoriteit 100%

Nadat u zelf een beetje een stuk speelt, moet u gebruiken:

console.log(req.originalUrl)


2, Autoriteit 26%

In sommige gevallen moet u gebruiken:

req.path

Dit geeft u het pad, in plaats van de volledige gevraagde URL. Als u bijvoorbeeld alleen geïnteresseerd bent in welke pagina de gebruiker heeft aangevraagd en niet alle soorten parameters de URL:

/myurl.htm?allkinds&ofparameters=true

req.path geeft u:

/myurl.html

3, Autoriteit 22%

Om aan te vullen, is hier een voorbeeld dat is uitgebreid van de documentatie, die nauwelijks alles wikkelt wat u moet weten over de toegang tot de paden / URL’s in alle gevallen met Express:

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

Gebaseerd op: https://expressjs.com/en/api.html#req .Originalurl

Conclusie: Zoals C1MOORE’s antwoord staten, gebruik:

var fullPath = req.baseUrl + req.path;

4, Autoriteit 4%

het zou moeten zijn:

req.url

Express 3.1.x


5, Autoriteit 4%

//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 / wanneer het zou moeten zijn / account ??

De reden hiervoor is dat uitdrukkelijke aftrekkers het pad aftrackt dat uw handlerfunctie is gemonteerd, die '/account'in dit geval is.

Waarom doen ze dit?

Omdat het het gemakkelijker maakt om de handlerfunctie opnieuw te gebruiken. U kunt een handlerfunctie maken die verschillende dingen doet voor req.path === '/'en req.path === '/goodbye'bijvoorbeeld:

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

Vervolgens kunt u het koppelen aan meerdere eindpunten:

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

Geven:

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

Antwoord 6, autoriteit 4%

Voor versie 4.x kun je nu de req.baseUrlgebruiken naast req.pathom het volledige pad te krijgen. De OP zou nu bijvoorbeeld zoiets doen als:

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

Antwoord 7, autoriteit 2%

req.route.path werkt voor mij

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

na het uitvoeren zie ik het volgende in de console en krijg ik een perfect resultaat
in mijn browser.

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

Antwoord 8

1. Bel rechtstreeks vanuit het hoofdbestand (app.js / index.js):

app.get('/admin/:foo/:bar/:baz', async (req, res) => {
    console.log(req.originalUrl);
    console.log(req.url);
    console.log(req.path);
    console.log(req.route.path);
    console.log(req.baseUrl);
    console.log(req.hostname);
    console.log(req.headers.host) // OR req.header('host'));
    console.log(req.protocol);
    res.sendStatus(200);
});

API-oproep:

http://localhost:3000/admin/a/b/c

Uitvoer

/admin/a/b/c(originalUrl)
/admin/a/b/c(url)
/admin/a/b/c(pad)
/admin/:foo/:bar/:baz(route.path)
(baseUrl)
localhost(hostnaam)
localhost:3000(headers.host (hostnaam met poortnummer))
http(protocol)


2. Oproep vanuit een module:

app.js

const express = require('express');
const app = express();
...
const users = require('./users');
app.use('/api/users', users);

gebruikers.js

const express = require('express');
const router = express.Router();
...
router.get('/admin/:foo/:bar/:baz', async (req, res) => {
    console.log(req.originalUrl);
    console.log(req.url);
    console.log(req.path);
    console.log(req.route.path);
    console.log(req.baseUrl);
    console.log(req.hostname);
    console.log(req.headers.host) // OR req.header('host'));
    console.log(req.protocol);
    res.sendStatus(200);
});

API CALL:

http://localhost:3000/admin/a/b/c

Uitgang

/api/users/admin/a/b/c(Original)
/admin/a/b/c(URL)
/admin/a/b/c(pad)
/admin/:foo/:bar/:baz(route.path)
/api/users(BASEURL)
localhost(hostname)
localhost:3000(headers.host (hostnaam met poortnummer)
http(protocol)

Other episodes