2012-08-16 19 views
11

Ho cercato di capire come utilizzare le fibre del nodo per rendere il mio codice di database meno disordinato in node.js, ma non riesco a farlo funzionare. Ho bollito il codice fino a questo come un banco di prova minima:fibre node.js con 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(); 

Se lascio così com'è, ottengo il seguente errore:

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 

Tuttavia, se io commento la riga che chiama pconnect, ottengo il messaggio "function function" sulla console e nessun errore. L'esempio sulla pagina Github ha una struttura quasi identica, e funziona correttamente sul mio sistema, ma sono perplesso su cosa sto facendo male qui.

Edit: Osservazioni

Sono riuscito a ottenere il codice da eseguire dopo una moda in due modi diversi che sembrano estranei, ma entrambi hanno lo stesso comportamento. Al termine della funzione, il nodo si blocca e devo ucciderlo con ctrl-c. Qui ci sono le due cose che ho fatto per ottenere quel risultato:

1) Avvolgere pg.connect in una funzione anonima, e poi avvolgere CHE con Future:

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

2) Questo è un vero e proprio mistero, ma sembra avere lo stesso risultato. All'interno della fibra, ho chiamato direttamente pg.connect prima della chiamata a pconnect, e tutto sembra funzionare.

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

posso immaginare una circostanza in cui (1) avrebbe senso se, ad esempio, la funzione pg.connect ha altri argomenti opzionali che sono in qualche modo interferire con il layout previsto della chiamata Future.wrap. Un'altra possibilità è che un oggetto sta andando fuori dal campo di applicazione e il riferimento "questo" non è definito quando viene effettuata la chiamata effettiva a pconnect. Non riesco a capire perché (2) abbia qualche effetto.

Edit: risposta parziale

Va bene, così ho risposto almeno una parte della questione. Il pensiero avevo sull'ambito oggetto rivelato essere corretti, e utilizzando la funzione bind() ho potuto eliminare lo strato supplementare di callback incarto:

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

E ancora appeso al termine dell'esecuzione di motivi sconosciuti però.

risposta

1

Disconnettersi dal database al termine dell'esecuzione?

In caso contrario, impedisce l'uscita dal programma node.js.

0

Aggiunta di un altro codice personale che perde.

@Almad sto scollegare qui con la richiamata fornito, ma si blocca ancora:

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