簡體   English   中英

node.js纖維與pg / postgres

[英]node.js fibers with pg/postgres

我一直在試圖弄清楚如何使用node-fiber來使我的數據庫代碼在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包裝THAT:

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

盡管如此,它仍然在執行結束時掛起。

您是否在執行結束時與數據庫斷開連接?

如果沒有,它會阻止node.js程序退出。

添加我自己的另一個泄漏代碼。

@Almad我在這里用提供的回調斷開連接,但仍然掛起:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM