做Knex“Koa2方式”

时间:2017-12-19 08:50:41

标签: node.js knex.js koa2

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-knexknex作为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,这比上述选项更好?

0 个答案:

没有答案