我有一个用express.js编写的应用程序,我试图将此应用程序分为两部分:
Express也配置为从/unauth/public/
获取静态文件
我想为来自授权路线的请求添加第二个静态文件夹 - /auth/public
进入/ app / *
我的路线配置如下:
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')
:
Using express.static middleware in an authorized route
但我不知道,如何处理路由app.get('/auth/*', ...)
- 之前的修改将替换url,并且永远不会调用此路由..
答案 0 :(得分:2)
您可以尝试这样的事情:
// 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);
}
});
编辑:
如果您希望经过身份验证的用户能够访问auth和unauth目录中的文件,则可以对app.use
进行两次调用,如下所示:
app.use(unauthStatic);
app.use(function(req, res, next) {
if (! req.isAuthenticated()) {
return next();
}
authStatic(req, res, next);
});
答案 1 :(得分:0)
请记住,express在堆栈中使用中间件,意味着为给定的请求提供服务,所有已注册的中间件都按照它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,这条路线永远不会被调用..
这句话让我觉得你试图以某种方式处理表达静态中间件后的请求。这是不可能的:静态中间件提供静态文件,你不能执行其他逻辑,但你可以运行之前的东西!请注意,在我的代码中,授权中间件将在发送静态文件之前运行。