使用koa框架,常用的数据库模块如何封装?
最近正在研究koa,因为所有的middleware都是generator,一些现有的数据库模块还是基于传统的callback,无法配合yield使用。我现在调研的一些常见的库如下:
比如图里列出的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