2012-08-16 27 views
11

私はnode-fibresを使ってnode.jsでデータベースコードを乱雑にする方法を理解しようとしていましたが、動作させることはできません。私は、最小限のテストケースとしてダウンこれにコードを煮:pg/postgresを使用したnode.jsのファイバ

var Future = require('fibers/future'); 
var pg=require('pg'); 

var connstr = "pg://not_the_real_user:[email protected]/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ページの例はほとんど同じ構造をしていますが、私のシステムで正しく動作しますが、ここで間違っていることについては困惑しています。

編集:追加の詳細

私は関係のないように見える2つの異なる方法で流行した後に実行するコードを取得するために管理してきましたが、どちらも同じ動作をします。関数が終了した後、ノードがハングアップするだけで、ctrl-cでノードを削除する必要があります。

1)匿名関数でpg.connectをラップして、将来にすることを包む:

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

2)この1つは本物ですここで私はその結果を得るためにやった二つのことがありますミステリーが、同じ結果を持っているように見えます。ファイバーの中で、私は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(); 

Iは、例えば、pg.connect機能が何らかの形Future.wrapコールの期待レイアウトを妨害している他のオプションの引数を有する場合(1)理にかなっている状況を想像することができます。別の可能性は、オブジェクトが範囲外になり、pconnectへの実際の呼び出しが行われたときに "this"参照が定義されていないことです。私はなぜ(2)が何らかの効果を持つ理由を理解することができない。

編集:部分的な答え

わかりましたので、私は質問の少なくとも一部に答え。オブジェクトスコープについて私が持っていた考えが正しいことが判明し、私は、コールバックラッピングの追加の層を排除することができたバインド()関数で使用することにより:

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

をそれはまだの実行の終了時にハングアップしますしかし、未知の理由。

答えて

1

実行終了時にデータベースから切断していますか?

そうでない場合、node.jsプログラムが終了しないようにします。

0

自分の別のコードを追加して漏洩します。

var future = Future.task(function() { 
    var ret = Future.wrap (pg.connect.bind(pg), "array") (conString).wait(); 
    ret[1](); 
}).detach(); 
:私が提供するコールバックして、ここで切断するが、それでもハングてる

@Almad

関連する問題