考虑到两个中间件,如何添加首先被击中的内容,然后确定将请求传递到哪个中间件。该请求只能被删除或转发到其中一个中间件,而不能同时转发。
app.use( function *(next) {
if (isAuthenticated)
*private middleware*
else
*use public middleware*
});
更具体地说:
我有一个主页/
应该有一个可变响应,具体取决于用户是否登录(在此处使用基于令牌的身份验证)。为简单起见,如果请求用户没有令牌,则public.html
是private.html
对带有效令牌的请求的响应。
现在这很容易在一个函数中实现,但我想要分离路由器,这样可以使代码更易于管理。
所以我需要以某种方式选择请求转到哪个中间件路由器?不知道该怎么做。
var publicR = new router();
publicR.get('/', function *(next) {
....public.html....
});
var privateR = new router();
privateR.get('/', function *(next) {
....private.html....
});
app.use(function(){
if(isAuthenticated)
...use privateR.routes();
else
...use publicR.routes();
});
答案 0 :(得分:3)
首先,在登录或未登录时,为给定的URL呈现完全不同的内容并不是一个好主意,因此,尝试让两个不同的路由器都服务于相同的路由,但一个用于登录用户,另一个用于未登录用户可能不是一个好的设计理念。
更常见的情况是在登录时让页面的一部分可能不同。在这种情况下,您有一条路线创建页面,该页面处理与登录时内容略有不同的内容。
如果您确实希望在登录时拥有完全不同的内容和行为,那么您应该在登录时重定向到其他URL。在这种情况下,您可以使用完全不同的路由器来记录"已记录在"网址。这对搜索引擎也会更好,因为给定的URL将报告一致的内容,而不会根据用户的状态而有所不同。这也使得在Express中使用路由器非常容易。您已登录"路由器提供登录的URL。您可以使用中间件检查登录的URL,看看您是否实际登录,如果没有,则重定向回非登录页面,反之亦然。
答案 1 :(得分:1)
如果其他人遇到此问题,这对我有用:
var publicR = new router();
publicR.get('/', function *(next) {
....public.html....
});
var privateR = new router();
privateR.get('/', function *(next) {
....private.html....
});
app.use(mySwitcher);
function *mySwitcher(next){
if(isAuthenticated)
yield privateR.routes().call(this,next);
else
yield publicR.routes().call(this,next);
}