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

How to skip or jump middleware? (node)

本文关键字:节点 中间件 何跳过      更新时间:2023-09-26

给定两个中间件,如何添加首先被击中的东西,然后确定将请求传递给哪个中间件。请求只能删除或转发到其中一个中间件,而不能同时删除或转发到两个中间件。

app.use( function *(next) {
    if (isAuthenticated)
        *private middleware*
    else
        *use public middleware*
});

更具体地说:
我有一个主页/应该有一个可变的响应,具体取决于用户是否登录(在此处使用基于令牌的身份验证(。为简单起见,如果请求用户没有令牌,则public.htmlprivate.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();
});

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

更常见的情况是页面的一部分在登录时可能有所不同。 在这种情况下,您有一个单一的路由来创建页面,该页面处理在登录或不登录时对内容执行略有不同的操作。

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

如果其他人遇到此问题,这对我有用:

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