Node.js 如何在重定向Express 4之前找到原始请求路径

Node.js 如何在重定向Express 4之前找到原始请求路径,node.js,express,authorization,httprequest,passport.js,Node.js,Express,Authorization,Httprequest,Passport.js,假设我正在尝试访问路径http://localhost:3000/users#/WyCrYc28r/foo/1414585518343。 但是路径/users需要仅由经过身份验证的用户访问,如下所示: app.get('/users', isLoggedIn, function (req, res) { req.session.user = req.user; res.cookie('uid', req.session.passport.user)

假设我正在尝试访问路径
http://localhost:3000/users#/WyCrYc28r/foo/1414585518343
。 但是路径
/users
需要仅由经过身份验证的用户访问,如下所示:

  app.get('/users', isLoggedIn, function (req, res) {
      req.session.user = req.user;
      res.cookie('uid', req.session.passport.user)
          .render('users', { title: 'The Foo Machine', user: req.user });
  });
下面是
isLoggedIn
中间件:

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
      return next();
  res.redirect('/login');
}
下面是如何处理
登录

app.post('/login', passport.authenticate('local-login', {
    successRedirect: '/users', 
    failureRedirect: '/login', 
    failureFlash: true 
}));
我被重定向到
http://localhost:3000/users
登录后,但我希望用户转到
http://localhost:3000/users#/WyCrYc28r/foo/1414585518343
成功登录后,因为这是用户想要去的地方

我在这里使用
PassportJS
模块进行身份验证/授权,并在
AngularJS
中开发前端


有人能帮我一下吗?

我能想出两种常见的解决方案。在其中添加angularjs可能会使事情变得复杂一些,但这可能会让您开始:

1) 将url另存为重定向url中的查询参数

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
    return next();
  res.redirect('/login?fromUrl='+req.originalUrl);
}
然后在登录后,您获得该值并执行重定向,例如:

app.post('/login', passport.authenticate('local-login'), { failureRedirect: '/login', failureFlash: true },
  function(req, res) {
    res.redirect(req.param('fromUrl'));
});
app.post('/login', passport.authenticate('local-login'), { failureRedirect: '/login', failureFlash: true },
  function(req, res) {
    res.redirect(req.session.fromUrl);
});
2) (没有那么容易或可扩展)使用会话状态存储来自url的内容。它可能看起来像:

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
    return next();
  req.session.fromUrl = req.originalUrl;
  res.redirect('/login');
}
然后在登录后,您获得该值并执行重定向,例如:

app.post('/login', passport.authenticate('local-login'), { failureRedirect: '/login', failureFlash: true },
  function(req, res) {
    res.redirect(req.param('fromUrl'));
});
app.post('/login', passport.authenticate('local-login'), { failureRedirect: '/login', failureFlash: true },
  function(req, res) {
    res.redirect(req.session.fromUrl);
});

嘿,mattyice,
req.originalUrl
给了我值
/users
,后来我得到了一个
类型错误:无法使用我尝试的第一个解决方案调用null的方法'param'。有趣的是…所以在我的测试中originalUrl有哈希后缀,所以我不确定这是怎么回事。至于“param”部分,我对passport API不太熟悉,因此我不得不离开这里的示例()。我的例子似乎是合法的,但它显然没有向您传递请求对象。也许可以尝试删除第二个参数“{failureRedirect:'/login',failureFlash:true}”,作为测试?我将中间件
isLoggedIn
移到顶部,不知怎的,我在
/login?fromUrl='+req.originalUrl
中获得了
req.originalUrl
的哈希部分,但是它仍然在控制台上为
req.originalUrl
打印
/users
。而且我仍然得到了我得到的
TypeError:cannotcall方法'param'的null
error。删除
{failureRedirect:'/login',failureFlash:true}
没有任何区别。好的,是的,就像我说的,我对passport api不太了解。您只需使用passport以某种方式设置来自
req
obj的重定向url,该部分就可以工作了。