Javascript 如何跳过或跳转中间件?(节点)

Javascript 如何跳过或跳转中间件?(节点),javascript,node.js,middleware,koa,koa-router,Javascript,Node.js,Middleware,Koa,Koa Router,给定两个中间件,如何添加会首先命中的内容,然后确定将请求传递到哪个中间件。请求只能被丢弃或转发到其中一个中间件,而不能同时被两者 app.use( function *(next) { if (isAuthenticated) *private middleware* else *use public middleware* }); 更具体地说: 我有一个主页/,根据用户是否登录(此处使用基于令牌的身份验证),该主页应该有一个可变的响应。为简单

给定两个中间件,如何添加会首先命中的内容,然后确定将请求传递到哪个中间件。请求只能被丢弃或转发到其中一个中间件,而不能同时被两者

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();
});

如果其他人遇到此问题,这对我来说是有效的:

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);
}

首先,在登录或未登录时,为给定URL呈现完全不同的内容是不寻常的,而且不是一个好主意。因此,尝试让两个不同的路由器都服务于相同的路由,但一个用于登录用户,另一个用于未登录用户可能不是一个好的设计想法

更常见的情况是页面的一部分在登录时可能会有所不同。在这种情况下,您有一条创建页面的路径,该路径在登录或未登录时处理与内容稍有不同的操作


如果您真的想在登录时拥有完全不同的内容和行为,那么您可能应该在登录时重定向到不同的URL。在这种情况下,您可以对“登录”URL使用完全不同的路由器。这对于搜索引擎也会更好,因为给定的URL将报告一致的内容,并且不会因用户的状态而有所不同。这也使得在Express中使用路由器变得非常容易。您的“登录”路由器为登录的URL提供服务。您可以使用中间件来检查登录的URL,以查看您是否实际登录,如果没有,则重定向回未登录页面,反之亦然。

只需使用一个自定义中间件处理程序来检查条件并自行决定调用哪个其他函数。@jfriend00很抱歉,我没有遵循,你所说的“调用哪个函数”是什么意思?与其依赖于中间件的菊花链,不如在传递
req
res
时调用你定义的函数(如果需要)。@KevinReilly我是否必须重写我所有的路由函数,或者是否有一种简单的方法来使用(或调用)它们?谢谢你,哈哈,我想我没有看到这方面的例子是有原因的。我只是想了解中间件链接是如何工作的,对我来说,这通常意味着做技术上不应该做的事情。