【问题标题】:Whats the point of composing middleware in Koa?在 Koa 中编写中间件有什么意义?
【发布时间】:2017-01-04 08:08:32
【问题描述】:

我正在研究 Koa2,我看到了 koa-compose。我知道我给它中间件并返回一个,但是为什么呢?将多个中间件包装为一个而不是单独添加它们有什么好处?

app.use(compose(m1, m2))

对比:

app.use(m1)
app.use(m2)

【问题讨论】:

    标签: koa


    【解决方案1】:

    KoaJS 在下面使用koa-compose (here),所以app.use(compoase([m1,m2]));app.use(m1); app.use(m2); 是一样的。显式使用koa-compose 可以为自定义提供更多功能。以下是这样一种情况:

    通过app.use(middleware)添加中间件,将导致所有中间件按指定顺序在每个请求上执行。但是,如果您想为每个路由(或以不同的顺序)有选择地运行不同的中间件集,您可以显式使用 koa-compose 为每个路由创建专门的中间件堆栈。

    var app = require('koa')();
    var router = require('koa-router')();
    var compose = require('koa-compose');
    
    var allMiddlewares = compose([m1,m2,m3]);
    
    router.get('/', allMiddlewares);
    // selectively enable logging middleware for this route
    router.get('/test', compose(logger, allMiddlewares));
    
    app
      .use(router.routes())
      .use(router.allowedMethods());
    

    【讨论】:

    • 你是说 koa-compose 的唯一目的是将中间件组织成集合,这样我基本上可以少打字吗?如果不是,我想看一个例子,因为我不清楚它的好处。
    • @Yashua 没有 koa-compose,因为它的名字是用来将一组中间件组合成一个中间件。使用方式和使用地点取决于具体场景。以上只是一种可能的情况。
    • 我很抱歉太密集了。那么什么是我必须使用它的例子 - 即我不能使用单独的中间件?
    • @zeronone 我认为compose() 需要一个中间件数组,所以您的示例compose(m1,m2,m3) 实际上应该是compose([m1,m2,m3])
    • 很抱歉在这里迟到了,但我刚刚找到了这个库,它非常适合我的需要。我正在尝试创建一套标准的中间件供我的团队使用。我可以使用它来将它们“组合”成一个中间件,我可以将其导出为任何人都可以包含的库,并使我们所有的应用程序都从一个共同的基线开始。
    【解决方案2】:

    我对为什么需要使用 koa-compose 也有同样的疑问,因为 koa 本身可以处理多个中间件。但最近我一直在研究我的 koa 服务器的身份验证部分。

    我必须检查用户是否经过身份验证,有时我需要检查用户角色是否符合要求。在这种情况下,我有两个中间件,一个叫isAuthenticated,另一个叫hasRoles

    一些路由暴露给任何经过身份验证的用户,所以我可以这样做

    .get('/', auth.isAuthenticated, handler())
    

    但是对于路由需要检查用户角色是否满足要求,我需要这样做

    .get('/', auth.isAuthenticated, auth.hasRole('admin'), handler())
    

    当我有其他身份验证中间件时,我放入路由中的中间件会变得很长。 使用 koa-compose 让我受益匪浅,因为在我的情况下,我可以将 isAuthenticatedhasRoles 中间件链接在一起。

    requiresRole(role) {
        return compose([isAuthenticated, hasRole(role)])
    }
    
    .get('/', auth.requiresRole('admin'), handler())
    

    它简洁且错误更少。

    【讨论】:

    • 嘿,我处于类似情况,我有一个小问题..我如何将经过身份验证或需要角色的结果输入我的处理程序
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多