我有一个“控制器”中间件(连接到 koa-router)。
我想知道组织我的“内部”应用程序逻辑的最佳方法是什么(在我的控制器之外,连接到 koa-router 的中间件功能 router.post('/', createCtrl)
)。
第一种情况:"Everything is a middleware"。我的控制器只是组成了一组中间件函数,这些函数需要逐步从初始请求对象变为非常适合的响应对象。(我通过 读取并传递下一个中间件所需的参数
ctx.state
)。import * as view from './views' import * as repo from './repository' import * as response from '../../services/response' import { sign } from '../../services/jwt' import compose from 'koa-compose' const createCtrl = compose([ repo.create(), sign(), view.sessionUser(), response.success(201) ])
第二种情况:应用逻辑与 Koa 完全“解耦”。控制器将是一个调用非中间件函数的 koa 中间件,如下所示:
import * as view from './views' import * as repo from './repository' import * as response from '../../services/response' import { sign } from '../../services/jwt' const createCtrl = async function (ctx) { try { const entity = await repo.create() const token = await sign(entity.id) const dto = view.sessionUser(token, entity) const response = response.success(201) response(ctx, dto) // <- this is also a middleware } catch(err) { ctx.throw(500, 'my not very well handled error') } }
将控制器视为中间件功能的组合是个好主意吗?或者这是对中间件功能的误用?