在Koa中构建中间件的重点是什么?

时间:2016-08-28 00:01:25

标签: koa

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

app.use(compose(m1, m2))

VS

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

2 个答案:

答案 0 :(得分:10)

KoaJS使用koa-compose下面的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()); 为每个路由创建专门的中间件堆栈。

{}

答案 1 :(得分:3)

我有同样的问题为什么我们需要使用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())

它整洁,错误少。