在the docs for Application中有关于使用context
公开ctx
中广泛使用的属性的说明:
例如,要从ctx添加对数据库的引用:
app.context.db = db(); app.use(async ctx => { console.log(ctx.db); });
然而,它还指出,更多依赖ctx
“可被视为反模式”。很公平。
然后我们koa-knex-realworld-example建议这样的事情:
module.exports = function (app) { // ... const db = require('knex')(config.db) app.db = db // ... return async function (ctx, next) { if (ctx.app.migration && promise) { await promise } return next() } }
并将app
实例传递给中间件:
app.use(db(app))
这对我来说很奇怪。必须将app
传递给自己的中间件似乎有点倒退,但也许这是一个已知的Koa模式?
最后,我们有koa-knex将knex
作为this.knex
暴露在堆栈中的中间件中:
app.use(_.get('/:userid', function *(userid) { this.body = { profile: yield this.knex('users').where('id', userid); }; });
那个有点过时了(生成器,这很好,但不再是Koa的默认API)并在global
中查克Knex:
global.__knex || (global.__knex = Knex.initialize({ // ... })); this.knex = global.__knex; yield next;
有什么替代方案?
总之,我觉得我很乐意在上下文中引用Knex,我认为我不会想要用太多其他东西污染它。但是,如果我想要一个替代方案,是否有一种中间件方法可以在Koa2中使用Knex,这比上述选项更好?