Rafael Motta
Rafael Motta

Reputation: 2537

Rewrite url path using node.js

Is it possible to rewrite the URL path using node.js?(I'm also using Express 3.0)

I've tried something like this:

req.url = 'foo';

But the url continues the same

Upvotes: 19

Views: 48993

Answers (3)

Sergey Gurin
Sergey Gurin

Reputation: 1563

you need override some properties of req (IncomingMessage in NodeJs):

  • url
  • path
  • search
  • query

2

function changeUrl(req, url) {
    const parsedUrl = new URL(url);
    req.url = url;
    req.originalUrl = url;
    req.path = parsedUrl.pathname;
    req.search = parsedUrl.search;
    req._parsedUrl = parsedUrl;
    const query = {};
    for(const entry of parsedUrl.searchParams) {
        query[entry[0]] = entry[1];
    }
    req.query = query;
}

Upvotes: 1

Tiago Gouvêa
Tiago Gouvêa

Reputation: 16740

A good idea should be to update the path too. My method suggestions:

app.use(function(req, res, next) {
    console.log("request", req.originalUrl);
    const removeOnRoutes = '/not-wanted-route-part';
    req.originalUrl = req.originalUrl.replace(removeOnRoutes,'');
    req.path = req.path.replace(removeOnRoutes,'');
    return next();
});

By this way /not-wanted-route-part/users will became /users

Upvotes: 2

David Weldon
David Weldon

Reputation: 64312

Sure, just add a middleware function to modify it. For example:

app.use(function(req, res, next) {
  if (req.url.slice(-1) === '/') {
    req.url = req.url.slice(0, -1);
  }
  next();
});

This function removes the trailing slash from all incoming request URLs. Note that in order for this to work, you will need to place it before the call to app.use(app.router).

Upvotes: 47

Related Questions