Express js-не удается перенаправить

Я пытаюсь сделать следующее:

от клиента

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

в express root

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 ответов


браузер не перенаправляет окно на перенаправление в ответе 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;
    });

Я на самом деле столкнулся с тем же самым при разработке приложения. Кажется, Express не перенаправляет, если метод post.

попробуй:

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

Я делаю что-то подобное при использовании OAuth2. У меня есть ссылка на одну из моих страниц, и это, в свою очередь, перенаправляет в Google.

для перенаправления в другое место следующий код выполняет фактическое перенаправление

app.get('/GoogleRequestAuthorization.html',function(req,res) {
.
.
.
.

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

});

url-адрес, на который вы хотите перенаправить.

полная функция...


Я пришел к аналогичной проблеме и решил ее, проверив тип запроса. В моем случае я использую 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 respose:

$.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, который будет обработан как ошибка.