node.js光纤与pg / postgres

我一直在试图弄清楚如何使用节点光纤来使我的数据库代码在node.js中不那么混乱,但我无法让它工作。 作为一个最小的testing用例,我将代码解释为:

var Future = require('fibers/future'); var pg=require('pg'); var connstr = "pg://not_the_real_user:or_password@localhost/db"; var pconnect = Future.wrap(pg.connect); Fiber(function() { var client = pconnect(connstr).wait(); console.log("called function"); }).run(); 

如果我离开它,我得到以下错误:

 pgfuture.js:10 }).run(); ^ TypeError: undefined is not a function at Object.PG.connect.pools.(anonymous function).genericPool.Pool.create (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:49:20) at dispense (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:223:17) at Object.exports.Pool.me.acquire (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:267:5) at PG.connect (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:75:15) at Future.wrap (/home/erik/code/treehouse-node/node_modules/fibers/future.js:30:6) at /home/erik/code/treehouse-node/pgfuture.js:8:18 

但是,如果我注释掉调用pconnect的那一行,我会在控制台上看到“调用函数”消息,并且没有错误。 在github页面上的例子有一个几乎相同的结构,它在我的系统上正常工作,但我很难在这里做错了什么。

编辑:其他细节

我已经设法让代码在两种不同的方式之后运行,看起来不相关,但两者都有相同的行为。 函数完成后,节点只是挂起,我不得不用ctrl-c杀死它。 下面是我做了两件事情来获得这个结果:

1)将pg.connect封装在一个匿名函数中,然后用Future包装:

 pconnect = Future.wrap(function(err,cb){pg.connect(err,cb);}); 

2)这是一个真正的谜,但它似乎有同样的结果。 在光纤内部,我只是在调用pconnect之前直接调用pg.connect,似乎一切都可以实现。

 // add this line before call to pconnect pg.connect(connstr, function(e,c){console.log("connected.");}); // and now the original call to pconnect var client = pconnect(connstr).wait(); 

我可以想象一个情况,其中(1)有意义,例如,pg.connect函数有其他可选参数,这些参数会以某种方式干扰Future.wrap调用的预期布局。 另一种可能性是一个对象超出了作用域,当对pconnect进行实际的调用时,这个“引用”是不确定的。 我不明白为什么(2)有任何效果。

编辑:部分答案

好的,所以我回答了至less部分的问题。 我对关于对象范围的想法certificate是正确的,通过使用bind()函数,我能够消除额外的callback包装层:

 var pconnect = Future.wrap(pg.connect.bind(pg)); 

尽pipe如此,它仍然在执行结束时挂起。

你是否在执行结束时从数据库断开连接?

如果不是,则阻止node.js程序退出。

添加我自己泄漏的另一个代码。

@Almad我在这里与提供的callback断开连接,但仍然挂起:

 var future = Future.task(function() { var ret = Future.wrap (pg.connect.bind(pg), "array") (conString).wait (); ret[1](); }).detach();