Express – 公共目录分为授权/未授权用户

我有一个用express.js编写的应用程序,我试图把这个应用程序分成两部分:

  • 一个用于未经授权的用户(路由仅限于/ – 着陆页,/ login和/ * – error404)
  • 和第二个(路线将是:/ – 着陆页,/应用程序/ * – angular度SPA将自行处理路由)

Express也被configuration为从/unauth/public/获取静态文件并且我想为来自授权路由的请求添加第二个静态文件夹 – /auth/public转到/ app / *

我的路由configuration如下所示:

 var authRoutes = express.Router(); var unauthRoutes = express.Router(); authRoutes.get('/app/*', function(req, res, next) { if(!req.isAuthenticated()) return res.redirect("/login/"); res.send("AUTHORIZED"); }); unauthRoutes.get('/', function(req, res, next) { res.send("LANDING PAGE"); }); unauthRoutes.get('/login/', function(req, res, next) { if(req.isAuthenticated()) return res.redirect("/app/"); res.send("LOGIN PAGE"); }); unauthRoutes.get('/registration/', function(req, res, next) { if(req.isAuthenticated()) return res.redirect("/app/"); res.send("REGISTRATION PAGE"); }); unauthRoutes.get('/*', function(req, res, next) { res.send("ERROR 404"); }); app.use('/', authRoutes); app.use('/', unauthRoutes); 

我试图修改req.url并基于此调用另一个静态oruter express.static('auth/public')

在授权的路线中使用express.static中间件

但我不知道,如何处理路线app.get('/auth/*', ...) – 以前的修改将取代url,这条路线永远不会被调用..

你可以尝试这样的事情:

 // Create your static middlewares var unauthStatic = express.static('unauth/public'); var authStatic = express.static('auth/public'); // This goes in place of where you would normally load your static middleware app.use(function(req, res, next) { if (req.isAuthenticated()) { authStatic(req, res, next); } else { unauthStatic(req, res, next); } }); 

编辑:

如果你想要authentication的用户能够从auth和unauth目录访问文件,你可以对app.use进行两个调用,就像这样:

 app.use(unauthStatic); app.use(function(req, res, next) { if (! req.isAuthenticated()) { return next(); } authStatic(req, res, next); }); 

请记住,express在堆栈中使用中间件,意思是服务于一个给定的请求,所有注册的中间件都按照它use的顺序use d。 一旦有一些中间件调用了req.send,就不会再有中间件被执行了。 无论如何,尝试这样的事情:

 function Authorization(req, res, next) { if(!req.isAuthenticated()) return res.redirect("/login"); next(); } var AnonRouter = express.Router() // GET /style.css will request /unauth/public/style.css .use(express.static('unauth/public')) .get('/', function (req, res) { }) .get('/login', function (req, res) { }); var AuthRouter = express.Router() .use(Authorization) // GET /app/style.css will request /auth/public/style.css .use(express.static('auth/public')) .get('*', function (req, res, next) { // Handle reqs for non-static files }); app.use('/', AnonRouter); app.use('/app', AuthRouter); app.get('*', function (req, res) { res.status(404).send('404!'); }); 

但我不知道,如何处理路线app.get('/ auth / *',…) – 以前的修改将取代url,这条路线永远不会被调用..

这个声明让我觉得你正在尝试 express的静态中间件被调用以某种方式处理请求。 这是不可能的:静态中间件提供静态文件,你不能执行额外的逻辑,但你可以在之前运行的东西! 请注意,在我的代码中,授权中间件将在发送静态文件之前运行。