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