Ich habe versucht herauszufinden, wie man Knoten-Fasern verwenden, um meinen Datenbank-Code in node.js weniger unordentlich zu machen, aber ich kann es nicht zum Funktionieren bringen. Ich gekocht den Code unten zu diesem als Mindesttestfall:node.js Fasern mit 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();
Wenn ich es lassen wie es ist, ich die folgende Fehlermeldung erhalten:
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
Allerdings, wenn ich die Zeile aus kommentieren, die Anrufe pconnect, bekomme ich die "called function" -Meldung auf der Konsole und keine Fehler. Das Beispiel auf der GitHub-Seite hat eine fast identische Struktur, und es funktioniert auf meinem System korrekt, aber ich bin ratlos, was ich hier falsch mache.
Edit: Weitere Details
Ich habe es geschafft, den Code zu erhalten nach einer Mode auf zwei verschiedene Arten ausgeführt werden, die in keinem Zusammenhang erscheinen, aber beide haben das gleiche Verhalten. Nachdem die Funktion beendet ist, hängt der Knoten einfach und ich muss ihn mit ctrl-c beenden. Hier sind die beiden Dinge, die ich getan habe, dieses Ergebnis zu erhalten:
1) Wickeln pg.connect in einer anonymen Funktion, und dann wickeln die mit Zukunft:
pconnect = Future.wrap(function(err,cb){pg.connect(err,cb);});
2) Dieses ist eine echte Geheimnis, aber es scheint das gleiche Ergebnis zu haben. In der Faser rufe ich direkt pg.connect an, bevor der Anruf an pconnect geht, und alles scheint zu funktionieren.
// 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();
Ich kann einen Umstand vorstellen, bei dem (1) Sinn machen würde, wenn zum Beispiel der pg.connect Funktion weitere optionale Argumente hat, das mit dem erwarteten Aufbau des Future.wrap Anrufs irgendwie zu stören ist. Eine andere Möglichkeit besteht darin, dass ein Objekt den Gültigkeitsbereich verlässt und die Referenz "this" nicht definiert ist, wenn der eigentliche Aufruf von pconnect erfolgt. Ich verstehe nicht, warum (2) etwas bewirkt.
Edit: Teilantwort
Okay, so antwortete ich zumindest ein Teil der Frage. Der Gedanke, den ich über das Objekt Umfang hatte sich herausgestellt, korrekt zu sein, und durch die bind() Funktion konnte ich die zusätzliche Schicht von Callback-Verpackung beseitigen:
var pconnect = Future.wrap(pg.connect.bind(pg));
Es hängt immer noch am Ende der Ausführung für unbekannte Gründe.