I want to exclude the public
folder and all static files and subfolders from express router.
Currently I have defined 1) the public folder, 2) the router as suggested in several SF answers:
// 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());
Later on I have a catch all that checks the user login:
self.app.use(function (req, res, next) {
var redirect_uri = '/login';
if (req.user) {
return next();
} else {
return res.redirect(redirect_uri);
}
});
This route causes the 304
redirect on static files as well under the public
folder.
An option would be to use a path based middleware like 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
to be used like
app.use(unless(redirectPage, "/user/login", "/user/register"));
But how to apply in my case? Let's consider that public files are server under the /
path (i.e. the public
folder) and its subfolders (like css
, js
, images
or even files like favicon.ico
, robots.txt
, etc.).