He estado tratando de descubrir cómo usar fibras de nodo para hacer que el código de mi base de datos sea menos complicado en node.js, pero no puedo hacer que funcione. Herví el código de abajo a esto como un caso de prueba mínima:fibras 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();
Si lo dejo como está, me sale el siguiente error:
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
Sin embargo, si me comente la línea que llama pconnect, aparece el mensaje "función llamada" en la consola y no hay errores. El ejemplo en la página de github tiene una estructura casi idéntica, y funciona correctamente en mi sistema, pero no estoy seguro de lo que estoy haciendo mal aquí.
Editar: Detalles adicionales
He conseguido que el código se ejecute en cierto modo de dos maneras diferentes que parecen no estar relacionados, pero ambos tienen el mismo comportamiento. Después de que la función finaliza, el nodo simplemente se cuelga y tengo que matarlo con ctrl-c. Estas son las dos cosas que he hecho para conseguir ese resultado:
1) Envolver pg.connect en una función anónima, y luego envolver con Future QUE:
pconnect = Future.wrap(function(err,cb){pg.connect(err,cb);});
2) Éste es un verdadero misterio, pero parece tener el mismo resultado. Dentro de la fibra, llamo directamente a pg.connect antes de la llamada para conectar, y todo parece funcionar.
// 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();
puedo imaginar una circunstancia en la que (1) tendría sentido si, por ejemplo, la función pg.connect tiene otros argumentos opcionales que de alguna manera están interfiriendo con el trazado previsto de la llamada Future.wrap. Otra posibilidad es que un objeto salga del alcance y la referencia "this" no esté definida cuando se realiza la llamada real a pconnect. No entiendo por qué (2) tiene algún efecto.
Editar: respuesta parcial
bien, así que respondieron al menos parte de la pregunta. La idea que tenía sobre alcance objeto resultó ser correcto, y mediante el uso de la función bind() que era capaz de eliminar la capa adicional de envoltura de devolución de llamada:
var pconnect = Future.wrap(pg.connect.bind(pg));
Es todavía cuelga al final de la ejecución de sin embargo, razones desconocidas.