什么是在Koa组成中间件的重点?

cyb*_*bat 7 koa

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

app.use(compose(m1, m2))
Run Code Online (Sandbox Code Playgroud)

VS:

app.use(m1)
app.use(m2)
Run Code Online (Sandbox Code Playgroud)

zer*_*one 12

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());
Run Code Online (Sandbox Code Playgroud)

  • 很抱歉在这里晚些时候钟声但我刚刚找到了这个库,它完全符合我的需要.我正在尝试为我的团队创建一套标准的中间件.我可以使用它将它们"组合"成一个中间件,我可以将其导出为任何人都可以包含的库,并让我们的所有应用程序从一个共同的基线开始. (4认同)

Yun*_* Li 7

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

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

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

.get('/', auth.isAuthenticated, handler())
Run Code Online (Sandbox Code Playgroud)

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

.get('/', auth.isAuthenticated, auth.hasRole('admin'), handler())
Run Code Online (Sandbox Code Playgroud)

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

requiresRole(role) {
    return compose([isAuthenticated, hasRole(role)])
}

.get('/', auth.requiresRole('admin'), handler())
Run Code Online (Sandbox Code Playgroud)

它整洁,错误更少。