Экспресс JS - не может перенаправить - PullRequest
10 голосов
/ 23 ноября 2011

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

от клиента

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

в экспресс-корне

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 голосов
/ 23 ноября 2011

Браузер не перенаправляет окно на перенаправление при ответе 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;
    });
15 голосов
/ 23 ноября 2011

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

Попытка:

app.post('/dologin',function(req, res) {
  req.method = 'get'; 
  res.redirect('http://bbc.co.uk'); 
});
0 голосов
/ 12 февраля 2015

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

0 голосов
/ 06 февраля 2014

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

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

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

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

});

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...