我一直想弄清楚如何使用節點光纖使我的數據庫代碼在node.js中不那麼混亂,但我無法讓它工作。我煮代碼到這是一個最小的測試用例:node.js光纖與pg/postgres
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頁面上的示例具有幾乎相同的結構,並且它在我的系統上正常工作,但我很難理解我在這裏做錯了什麼。
編輯:其他細節
我已經成功地獲取代碼中似乎無關兩種不同的方式一種時尚後運行,但兩者具有相同的行爲。該函數完成後,節點只是掛起,我不得不用ctrl-c殺死它。這裏有兩件事情我已經做了,以得到這一結果:
1)總結pg.connect在一個匿名函數,然後包裹與未來:
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時,「this」引用未定義。我不明白爲什麼(2)有任何效果。
編輯:部分答案
好了,所以我回答了這個問題的至少一部分。我對對象範圍的想法被證明是正確的,並通過我能夠消除回調包裝的額外層的bind()函數:
var pconnect = Future.wrap(pg.connect.bind(pg));
它仍然掛起,在執行的結尾不明原因。