【问题标题】:Exclude public folder from Express router从 Express 路由器中排除公用文件夹
【发布时间】:2020-02-10 23:55:48
【问题描述】:

我想从 express 路由器中排除 public 文件夹和所有静态文件和子文件夹。

目前我已经按照several SF 答案中的建议定义了 1) 公用文件夹,2) 路由器:

        // public folder
        self.app.use(express.static(path.join(__dirname, 'public')));

        // static pages
        self._options.staticRoutes.forEach(route => {
            self.app.use(BASEPATH + route, express.static(path.join(__dirname, 'public')));
        });

        // register page renderer
        router.get(BASEPATH, renderer.render());

        // templates
        self._options.routes.forEach(route => {
            self.app.use(BASEPATH + route, router);
        });
        // router
        self.app.use(BASEPATH, router);

        // register error handlers
        self.app.use(renderer.logErrors());
        self.app.use(renderer.clientErrorHandler());
        self.app.use(renderer.catchAll());

稍后我会捕获所有检查用户登录的信息:

       self.app.use(function (req, res, next) {
            var redirect_uri = '/login';
            if (req.user) {
                return next();
            } else {
                return res.redirect(redirect_uri);
            }
        });

此路由会导致静态文件以及public 文件夹下的304 重定向。

一种选择是使用基于路径的中间件,例如here

var unless = function (middleware, ...paths) {
    return function (req, res, next) {
        const pathCheck = paths.some(path => path === req.path);
        pathCheck ? next() : middleware(req, res, next);
    };
};//unless

像这样使用

app.use(unless(redirectPage, "/user/login", "/user/register"));

但是如何申请呢?假设公共文件是/ 路径下的服务器(即public 文件夹)及其子文件夹(如cssjsimages 甚至是favicon.icorobots.txt 等文件.).

【问题讨论】:

  • 抱歉,您的问题不是很清楚。你想达到什么目的?也许一些上下文会更有帮助。
  • @Shumail 谢谢。我想避免在public文件夹下的静态文件上路由最后一个app.use
  • 你能分享你的代码你是如何尝试使用静态文件的?
  • @kisor 代码是:self.app.use(express.static(path.join(__dirname, 'public')));
  • self._options.staticRoutes.forEach(route => { self.app.use(BASEPATH + route, express.static(path.join(__dirname, 'public'))); });这是干什么用的

标签: javascript node.js express


【解决方案1】:

use middlewares in express有多种方式。

与其从应用程序级登录检查中排除静态/公共资源(在这里您可以读取请求并跳过对某些路径的检查),我宁愿在您的敏感路径中使用路由器级中间件。

您可以在当前路由调用中定义路由器级中间件,如下所示:

router.get('/path_of_the_route', middleware1, middleware2, ..., requestHandler);

通常我会这样做:

serverApp.use(express.static(__dirname + '/public'));

// loginController renders the login pages (and password-reset etc) and provides login/logout functionality
router.use('/', loginController);
router.use('/login', loginController);

// every request to the '/secured' path will be send through the authentication check middleware 
router.use('/secured', loginController.checkLoginMiddleware, securedContentPageController);

【讨论】:

  • 谢谢,这是一种选择,但我不知道这个特定的中间件一般应该如何处理公共文件路由。让我们考虑一个公共文件是/路径下的服务器(即public文件夹)及其子文件夹(如cssjs等)。
  • 我的观点是“不要在公共路径上使用身份验证中间件”。中间件不需要知道任何关于你的公共路由的信息。
  • 是的。我的敏感路径是/ 下的所有静态文件,因此在静态文件夹js/css/ 等下,所以我的'/path_of_the_route' 可能更像一个正则表达式,或者类似于这里的stackoverflow.com/questions/27117337/…
  • “敏感”是指“需要身份验证”。通常,您不需要身份验证即可访问公共资源(这就是它们被称为公共资源的原因)。当您认为/ 下的所有内容都“敏感”时,您将需要身份验证检查,我想知道您为什么问这个问题;)
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 2020-06-28
相关资源
最近更新 更多