Express js - 无法重定向

10

我想做以下事情:

来自客户端

var req =  jQuery.post(
  "http://www.example.com:3000"+"/dologin", 
  {"username" : username, "password" : password}).error(function(){
    alert("an error occurred");
  });

在Express的根目录下

app.post('/dologin',function(req, res) {
  res.redirect('http://bbc.co.uk');
});

结果传回

<p>Moved Temporarily. Redirecting to <a href="http://bbc.co.uk">http://bbc.co.uk</a></p>

看起来如果我使用jQuery进行发布,重定向将无法工作。有人知道如何强制重定向吗?

4个回答

19

在 AJAX 响应中进行重定向时,浏览器不会重定向窗口。需要使用 JavaScript 重定向浏览器。

例如,在服务器发送新站点作为内容。

res.contentType('application/json');
var data = JSON.stringify('http://site.example.com/')
res.header('Content-Length', data.length);
res.end(data);

在客户端

var req =  jQuery.post(
   "http://www.mysite.com:3000"+"/dologin", 
    {"username" : username, "password" : password}, 'json').error(function(){
       alert("an error occurred");
    }).success(function(data) {
       window.location = data;
    });

谢谢,这就是我最终所做的 - 感谢您的澄清。我希望他们能在服务器上覆盖请求类型。alessioalex建议使用req.method ='get';但对我没有起作用。 - Chin
1
覆盖请求类型并不重要,如果浏览器收到重定向响应的Ajax请求(例如$.post或$.get),它不会重定向窗口位置。顺便问一下,如果您认为我的答案可以,请接受它吗? - Teemu Ikonen

15

实际上,在开发应用程序时我也遇到了同样的问题。看起来 Express 在使用 POST 方法时不会重定向。

尝试:

app.post('/dologin',function(req, res) {
  req.method = 'get'; 
  res.redirect('http://bbc.co.uk'); 
});

1
谢谢 - 不幸的是它没有解决问题。我想我会改成从jquery获取 - 本质上,我正在尝试设置一个登录表单(在失败时发送一些json返回描述问题,在成功时重定向到站点中的另一页)。 - Chin
很奇怪,我刚在一个网站上使用了上面的解决方案进行测试,它可以正常工作。你确定你将req.method设置为“get”,而不是res.method吗? - alessioalex
使用 Express 2.5,代码如下:function(req, res) { req.method = 'get'; res.redirect('http://bbc.co.uk'); } - Chin
在expressjs指南(http://expressjs.com/guide.html#http-methods)中,作者(tjholowaychuk)在post路由内部使用了一个重定向- app.post('/', function(req, res){ console.log(req.body.user); res.redirect('back'); 我猜这与请求中的回调有关。 }); - Chin
也许你可以把你的代码放到网上,这样我就可以看一下(不过要把代码简化一些)。 - alessioalex
谢谢,非常感谢 - 这基本上就是问题中的全部内容。 - Chin

0

我遇到了类似的问题,并通过检查请求的类型来解决它。在我的情况下,我使用JSON,但它也适用于其他POST请求:

                var ajax = req.xhr;
                if(ajax) {
                    res.status(401).json({'msg':'redirect','location':'/login'});
                }
                else {
                    req.method = 'get';
                    res.status(401).redirect('/login');
                    //Or if you prefer plain text
                    //res.status(333).send("Redirect");
                }

这个处理Ajax POST和AJAX以及标准GET请求。 在客户端中,在Ajax响应回调函数中:

$.ajax({
        type: 'POST',
        data: Msg,
        url: '/some/post',
        dataType: 'JSON'
    }).success(function(data, textStatus, req ) {
        if(data.msg==="redirect") window.location = data.location;
        else {...}
    }).error(function(data, textStatus, req) {
         if(req=="Unauthorized") {
            alert("Unauthorized!");
            window.location = "/login";
        } else if (data.responseJSON.msg==="redirect") window.location = data.responseJSON.location;
        else {
           //...
        }
    });

实际上,您可以在此处处理更多的状态,除了302之外,它会自动由JQuery跟随,并且您将从要重定向到的页面获得200的响应。因此,在我的情况下,我避免发送302,而是发送401或任何其他状态,例如333,这将被视为错误。


0
当我使用OAuth2时,我正在做类似于这样的事情。我有一个指向我的页面之一的链接,然后将其重定向到谷歌。
要重定向到另一个位置,以下代码执行实际重定向。
app.get('/GoogleRequestAuthorization.html',function(req,res) {
.
.
.
.

res.writeHead(302, {location: url});
res.end();

});

url是您想要重定向到的地址。

完整的函数是...


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