使用koa框架,常用的数据库模块如何封装?
发布于 8 年前 作者 crystaldust 5824 次浏览 来自 问答

最近正在研究koa,因为所有的middleware都是generator,一些现有的数据库模块还是基于传统的callback,无法配合yield使用。我现在调研的一些常见的库如下:

koa-support.png

比如图里列出的memcached,目前没有现有的封装方案,我为了测试一般是在封装中返回一个Promise。不知道在使用koa的朋友们是怎么自己封装的?

P.S.附上我的wrapper:

function yieldify( target, methods ) {
  var wrapped = {};
  methods.forEach( function( method ) {
    wrapped[method] = function *() {
      var args = Array.prototype.slice.call( arguments );

      return new Promise( function( resolve, reject ) {
        args.push( function( err, result ) {
          if( err ) {
            reject( err );
          }
          else {
            resolve( result );
          }
        } );
        target[method].apply(target, args);
      } );
    }
  } );
  return wrapped;
}

这样写也是有问题的,前提是假设callback的参数都是 (error, result),但是对于一些数据库,可能是有3个参数(error, rows, fields),调用resolve的时候,其实就把第三个忽略了。

4 回复

你这样封装,最后能正确地返回 promise 吗?倒不如用 bluebird 来包装成 promise。

@zysam 多谢回复,这段代码主要是测试用的哈,主要想了解一下在生产环境上使用koa的朋友是怎么做封装的,大家一般都是用bluebird来包装吗?

@crystaldust 你可以尝试下 ThinkJS

本质上你需要的是一个把 callback 形式转换成 promise 形式的 lib,试试这个 https://github.com/thenables/thenify

回到顶部