11

我一直在试图弄清楚如何使用 node-fibers 使我的数据库代码在 node.js 中不那么混乱,但我无法让它工作。我将代码归结为最小测试用例:

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();

我可以想象一种情况,例如,如果 pg.connect 函数有其他可选参数以某种方式干扰 Future.wrap 调用的预期布局,那么 (1) 将是有意义的。另一种可能性是对象超出范围,并且在实际调用 pconnect 时未定义“this”引用。我不知道为什么(2)有任何影响。

编辑:部分答案

好的,所以我至少回答了部分问题。我对对象范围的想法被证明是正确的,并且通过使用 bind() 函数,我能够消除额外的回调包装层:

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

但由于未知原因,它仍然在执行结束时挂起。

4

2 回答 2

1

您是否在执行结束时断开与数据库的连接?

如果没有,它会阻止 node.js 程序退出。

于 2013-02-24T17:06:31.187 回答
0

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

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

var future = Future.task(function() {
   var ret = Future.wrap (pg.connect.bind(pg), "array") (conString).wait ();
   ret[1]();
}).detach();
于 2014-10-07T22:35:41.210 回答