重定向位置但不改变URL

14

如何使用原生的Express将用户重定向到不同的路由而不重定向URL?例如,如果我有以下路由:

express = require('express');
app = express();

app.route('/old').get(function(req, res, next) {
    res.redirect('/new');
});

app.route('/new').get(function(req, res, next) {
    res.send('This is the new route');
});

app.listen(3000);

当我将浏览器指向 http://localhost:3000/old 时,应用程序成功重定向,并且页面显示 This is the new route,但URL也已更改为 http://localhost:3000/new。如何让应用程序重定向到 new 路由,同时保持旧的URL (http://localhost:3000/old)?

我可以安装其他中间件(好像我还没安装够一百万个),但理想情况下,我希望不使用额外的中间件来完成此操作。另外,我正在完全使用Express.js进行此操作,不使用PHP、nginx或其他任何东西。我的应用程序将使用Angular.js,但这似乎更多是服务器端行为,而不是客户端行为。有时我会在客户端重定向,但我不想总是这样做。

2个回答

11

不要重定向,考虑使用请求模块(request module)发送一个GET请求,然后通过回调函数更新内容。

var request = require('request');

app.route('/old').get(function(req, res, next) {

  request.get('/new', function(err, response, body) {
    if (!err) {
      req.send(body);
    }
  });         
});

嗯,这让事情变得容易多了,有点像XMLHttpRequest对象和$.ajax之间的区别吧,我想。 - Ian Wang
这个可以工作,但是在处理 MIME 类型时需要小心。当请求为 .css 时,它会发送错误的类型。 - ekkis
1
这样可以让您的服务器处理页面加载,但如果您使用CDN等,则效果不佳。 - Guig
如果我们将文件托管在其他外部服务器上,并希望它处理负载,而不想自己处理传输文件的负载,该怎么办? - Pratik Singhal
3
req.send 不是一个函数 - 我猜你的意思是 res.send - Michał Terczyński
显示剩余2条评论

0
你可以创建一个帮助方法,让两个路由都使用它:
express = require('express');
app = express();

const newHandler = function(req, res, next) {
    res.send('This is the new route');
};
app.route('/old').get(newHandler);
app.route('/new').get(newHandler);

app.listen(3000);

请注意,在两个不同的路由中,newHandler 内部的 req.url 将是不同的,因此您可能需要处理它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接