Подтвердить что ты не робот

Node.js волокна с pg/postgres

Я пытался выяснить, как использовать node -fibers, чтобы сделать код моей базы данных менее беспорядочным в node.js, но я не могу заставить его работать. Я сварил код до этого как минимальный тестовый пример:

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 имеет почти идентичную структуру, и он работает правильно в моей системе, но я в тупике, что я делаю неправильно здесь.

Изменить: Дополнительные сведения

Мне удалось получить код для запуска после моды двумя разными способами, которые кажутся несвязанными, но оба имеют одинаковое поведение. После завершения функции node просто зависает, и я должен убить его с помощью ctrl-c. Вот две вещи, которые я сделал для получения этого результата:

1) Оберните pg.connect анонимной функцией, а затем оберните это с помощью Future:

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

2) Это реальная тайна, но, похоже, она имеет тот же результат. Внутри волокна я просто вызываю pg.connect перед вызовом pconnect, и все, кажется, работает.

// 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. Другая возможность заключается в том, что объект выходит за пределы области действия, а ссылка "this" undefined, когда выполняется фактический вызов pconnect. Я не понимаю, почему (2) имеет какой-то эффект.

Изменить: частичный ответ

Хорошо, поэтому я ответил хотя бы на часть вопроса. Мысль об объектной сфере оказалась правильной, и с помощью функции bind() я смог устранить дополнительный слой обертки обратного вызова:

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

Он по-прежнему висит в конце выполнения по неизвестным причинам.

4b9b3361

Ответ 1

Отключаетесь ли вы от базы данных в конце выполнения?

Если нет, это предотвратит выход из программы node.js.

Ответ 2

Добавление другого собственного кода, который протекает.

@Almad Я отключусь здесь с предоставленным обратным вызовом, но все еще зависаю:

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