koa2:如何组织路由器控制器逻辑(中间件 vs none-中间件)?
koa2: How to organize a router controller logic (middleware vs none-middleware)?
我有一个 "controller" 中间件(连接到 koa-router)。
我想知道组织我的 "internal" 应用程序逻辑的最佳方法是什么(在我的控制器之外,连接到 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)
])
第二种情况:应用逻辑"decoupled"完全来自Koa。控制器将是一个 koa 中间件,调用 none-中间件函数如下:
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')
}
}
将控制器视为中间件功能的组合是个好主意吗?或者这是对中间件功能的误用?
最好的方法是将逻辑与控制器分开。有了这种分离,您就可以在应用程序的其他部分重用相同的逻辑,并且更容易对其进行测试。
请检查此存储库:https://github.com/Talento90/typescript-node
我有一个服务器文件夹,我将所有服务器基础设施(如控制器和路由(均分开))放在其中,然后将我的管理器传递给服务器。管理器包含应用程序逻辑并传递给服务器。
总结一下:应用程序逻辑绝不能依赖于基础设施,在这种情况下是 HTTP 服务器。
我有一个 "controller" 中间件(连接到 koa-router)。
我想知道组织我的 "internal" 应用程序逻辑的最佳方法是什么(在我的控制器之外,连接到 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) ])
第二种情况:应用逻辑"decoupled"完全来自Koa。控制器将是一个 koa 中间件,调用 none-中间件函数如下:
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') } }
将控制器视为中间件功能的组合是个好主意吗?或者这是对中间件功能的误用?
最好的方法是将逻辑与控制器分开。有了这种分离,您就可以在应用程序的其他部分重用相同的逻辑,并且更容易对其进行测试。
请检查此存储库:https://github.com/Talento90/typescript-node
我有一个服务器文件夹,我将所有服务器基础设施(如控制器和路由(均分开))放在其中,然后将我的管理器传递给服务器。管理器包含应用程序逻辑并传递给服务器。
总结一下:应用程序逻辑绝不能依赖于基础设施,在这种情况下是 HTTP 服务器。