3

我知道这是错误的,但本质上我想

  • 通过 promise 连接到 db/orm
  • 等待该承诺履行并获得模型(承诺的回报)
  • 使用结果形成中间件生成器函数以将模型放置在请求中

我怀疑这不是最好的方法,所以基本上我有两个问题:

  • 我是否应该重写我的 db/orm 连接到生成器函数(我觉得更符合 koa 风格)
  • 回到最初的问题(因为我确信我不会有机会重写我所有的业务逻辑) - 我如何等待承诺完成然后返回生成器函数?

这是我糟糕的尝试——这不起作用,老实说我没想到会这样,但我想从编写代码开始,有一些东西可以解决这个问题:

var connectImpl = function() {
  var qPromise = q.nbind(object.method, object);
  return qPromise ; 
}

var domainMiddlewareImpl = function() {
    let connectPromise = connectImpl()
    return connectPromise.then(function(models){
        return function *(next){
            this.request.models = models ;
        }
    })
}

var app = koa()
app.use(domainMiddlewareImpl())
4

2 回答 2

2

根据this,您可以执行以下操作:

var domainMiddlewareImpl = function() {
    return function *(){
        this.request.models = yield connectImpl();
    };
};
于 2014-08-19T14:28:29.400 回答
0

基于 Hugo (thx) 提供的信息的上下文相关答案:

 var connectImpl = function() {
     var qPromise = q.nbind(object.method, object);
     return qPromise ; 
 }


var domainMiddlewareImpl = function () {
    let models = null ;
    return function *(next) {
        if(models == null){
            //////////////////////////////////////////////////////
            // we only want one "connection", if that sets up a 
            //     pool so be it
            //////////////////////////////////////////////////////
            models = yield connectImpl() ;
        }
        this.request.models = models.collections;
        this.request.connections = models.connections;
        yield next
    };
};

我的示例 connectImpl 在 ORM 中设置域模型(现在是水线),连接到数据库(池化),并返回 ORM 模型和数据库连接的承诺。我只希望这种情况发生一次,然后对于通过我的 Koa 中间件的每个请求,将对象添加到请求中。

于 2014-08-19T15:37:19.963 回答