快速重定向不会更改req.url

时间:2012-01-04 08:29:27

标签: node.js express pug

我有一条成功登录后重定向的路线

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仍然说/ login和我的pageTitle变量(通过模板变量设置)也不会改变。如果我在重定向后刷新页面,一切都会改变它应该的方式。只有在重定向之后它才会改变。

2 个答案:

答案 0 :(得分:1)

对于那些试图处理来自服务器控制的开发背景的ajax重定向的人来说,这是一个非常常见的混合。我的例子说明了如果授权失败会发生什么,略有不同;但您可以使用相同的拦截响应和检查状态等概念,并让客户端JavaScript执行重定向。

我的客户端代码实际上是一个主干模型,但反过来调用jquery的ajax,如:

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
      }

这对我来说是理想的。我还建议谷歌搜索ajax发布重定向,看看为什么这个

答案 1 :(得分:0)

看起来这是一个jQuery问题。至少这对我来说。您可以使用rel = external覆盖它。有关详情,请访问http://jquerymobile.com/demos/1.1.0/docs/pages/page-navmodel.html