Экспресс-перенаправление не меняет req.url - PullRequest
5 голосов
/ 04 января 2012

У меня есть маршрут, который перенаправляет при успешном входе в систему

app.post('/login', function(req, res){
  if(req.body.password === Server.cfg.auth.userPass) {
    req.session.user = {nick: req.body.username, pass: req.body.password}
    res.redirect('/chat')
  } else {
    res.render('user/login', { locals: { error: 'Invalid password' } })
  }
})

Перенаправление, кажется, работает, когда страница обновляется с помощью правильно отрисованного файла Jade. Тем не менее, URL-адрес по-прежнему говорит / логин и моя переменная pageTitle (устанавливается через шаблон Vars) также не изменяется Если я обновлю страницу после перенаправления, все изменится так, как должно быть. Только после перенаправления оно не меняется.

Ответы [ 2 ]

1 голос
/ 06 января 2012

Это должно быть довольно распространенным явлением для людей, пытающихся работать с ajax-перенаправлениями, происходящими из среды разработки, управляемой сервером. Мой пример показывает, что происходит, если авторизация не проходит, немного по-другому; но вы можете использовать ту же концепцию перехвата ответа и проверки статуса и т. д., и позволить клиентскому JavaScript выполнять перенаправление.

Мой клиентский код на самом деле является базовой моделью, но, в свою очередь, вызывает ajax jquery:

model.save({ error:function... 

Сервер

function requiresLogin(req, res, next) {  
    if(req.session.user) {
        next();
    } else {
        //res.redirect('/sessions/new?redir=' + req.url); // won't work
        res.send("Unauthorized", 403); // send 403 http status
    }
}

Клиент

  // Assumes you can get http status from response
  error: function(resp, status, xhr)...
      if(resp.status === 403) {
          window.location = '/sessions/new'; // optionally put a redirLastPage=somewhere
      }

Это работает так, как мне нужно. Я бы также посоветовал Google перенаправить сообщения ajax, чтобы понять, почему это

0 голосов
/ 23 июля 2012

Похоже, это проблема jQuery. По крайней мере, это было для меня. Вы можете переопределить его с помощью rel = external. Больше информации на http://jquerymobile.com/demos/1.1.0/docs/pages/page-navmodel.html.

...