如何在Express JS 4中进行URL重写

时间:2015-03-13 15:08:23

标签: node.js express

我正在尝试在Express JS 4中进行URL重写。我读到的所有内容都说我应该能够覆盖中间件中的request.url属性。重写的两个现有Node模块使用此方法。但是,当我尝试这样做时:

app.use('/foo', function(req, res){
    var old_url = req.url;
    req.url = '/bar';

    console.log('foo: ' + old_url + ' -> ' + req.url);
});

app.get('/bar', function(req, res) {
    console.log('bar: ' + req.url);
});

它只是不起作用。

可能有用的一条注意事项:无论使用何种实际网址,上面的req.url似乎始终为/。 Express 4是否更改了URL的维护方式,而不是更新文档?如何在Express 4中完成URL重写?

3 个答案:

答案 0 :(得分:7)

如果您希望在更改后继续处理,则必须在中间件中调用next()以继续处理其他处理程序。

app.use('/foo', function(req, res, next){
    var old_url = req.url;
    req.url = '/bar';

    console.log('foo: ' + old_url + ' -> ' + req.url);
    next();
});

doc for req.originalUrl说:

  

这个属性很像req.url;但是,它保留了原件   请求URL,允许您为内部自由重写req.url   路由目的。例如,app.use()的“安装”功能   将重写req.url以去除挂载点。

这肯定意味着您可以更改req.url以更改路由。


相关答案:Rewrite url path using node.js

答案 1 :(得分:1)

如果使用路由器,最好的解决方案是使用

req.url = '/new-url/';
app.handle(req, res, next);

详情请见gist

答案 2 :(得分:0)

由于某些原因,重写req.url不适用于app.use(...)。 (Express 4.17.1)

改为使用app.get(...):

// this doesn't work
app.use('/foo', function(req, res, next){
  req.url = '/bar';
  next()
});

// this works
app.get('/foo', function(req, res, next){
  req.url = '/bar';
  next()
});