来自已安装的中间件的.redirect()与相对目标失败

时间:2014-01-14 00:41:51

标签: javascript node.js express

我想将某个子树仅限于经过身份验证的用户。基本设置如下(去除脂肪):

app.use(express.bodyParser())
 .use(express.cookieParser('MY SECRET'))
 .use(express.cookieSession())
 .use('/admin', isAuthenticatedHandler)
 .use('/admin', adminPanelHandler);

处理程序的功能是:

isAuthenticatedHandler = function(req, res, next) {
   if (!req.session.username) {
     res.redirect('login');
   } else {
     next();
   }
};

问题在于,即使我将重定向目的地作为相对路径“登录”提供,但它不会导致<mount_point>/login/admin/login,而是导致/login当然会抛出404。

来自expressjs API参考:

 This next redirect is relative to the mount point of the application. 
 For example if you have a blog application mounted at /blog, ideally 
 it has no knowledge of where it was mounted, so where a redirect of 
 /admin/post/new would simply give you `http://example.com/admin/post/new`, 
 the following mount-relative redirect would give you
 `http://example.com/blog/admin/post/new`:

      res.redirect('admin/post/new');

我误解了这个吗?

2 个答案:

答案 0 :(得分:0)

你想要达到什么目的?为什么不直接重定向到'/ admin / login'?他们正在谈论的挂载点是Express应用程序所在的位置,而不一定是当前的URL。所以/ blog可能会在您的服务器上设置为您的应用程序的根目录,而/可能是一个完全不同的应用程序。至少那是我读这篇文章的方式。

答案 1 :(得分:0)

这里的问题是,当您使用/admin之外的中间件时,您的应用本身并未安装在/admin。您的应用仍然不在根目录中,如果请求来自isAuthenticatedHandler路径,您的配置只会说只使用/admin中间件。

我一起鞭打this gist。注意它如何使用2个Express应用程序,一个安装在另一个内部(第23行将其拉出)。这是将应用程序安装在不同点而不是仅仅将给定中间件放在给定点的示例。正如目前所写的那样,该示例将为您提供无限重定向,因为isAuthenticatedHandler会触发子应用程序中/之外的所有内容,这相当于整体/admin。使用2个单独的应用程序可能会引入您不希望处理的其他问题,我只提供了一个示例来说明Express在讨论安装整个应用程序时的含义。

对于您目前的问题,您需要遵循Yashua所说的内容并重定向到/admin/login或将您的管理界面作为单独的Express应用程序安装。