首页 文章

koa2:如何组织路由器控制器逻辑(中间件与非中间件)?

提问于
浏览
0

我有一个“控制器”中间件(连接到koa-router) .

我想知道组织我的"internal" app逻辑的最佳方法是什么(超出我的控制器,连接到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')
  }
}

将控制器视为中间件功能的组合是一个好主意吗?或者这是滥用中间件功能的意图?

1 回答

  • 1

    最好的方法是将逻辑与控制器分开 . 实现这种分离将允许您在应用程序的其他部分重用相同的逻辑,并且更容易测试它 .

    请检查此存储库:https://github.com/Talento90/typescript-node

    我有一个服务器文件夹,我把所有服务器基础设施,如控制器和路由(两者分开),然后我将我的经理传递给服务器 . 管理器包含应用程序逻辑并传递给服务器 .

    总结一下:在这种情况下,应用程序逻辑绝不能依赖于基础设施HTTP服务器 .

相关问题