0

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

我想知道组织我的“内部”应用程序逻辑的最佳方法是什么(在我的控制器之外,连接到 koa-router 的中间件功能 router.post('/', createCtrl))。

  1. 第一种情况:"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)
    ])
    
  2. 第二种情况:应用逻辑与 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')
      }
    }
    

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

4

1 回答 1

1

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

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

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

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

于 2018-09-14T16:17:19.403 回答