我一直试图在pg库中使用bluebird promises,甚至找到了这篇文章,但遗憾的是,我是一个StackOverflow新手,不能直接在那里发表评论:Manually promisifying pg.connect with Bluebird
简而言之,在对bluebird Promisfy函数进行剪切和粘贴之后,我尝试的所有操作都没有引入任何查询构造函数,也许我在尝试时误用了ClientAsync函数,但我希望这是一个快速而简单的帮助,因为我尝试的所有操作都会产生以下变化:
Possibly unhandled TypeError: Object function (err) {
if(err) {
pool.destroy(client);
} else {
pool.release(client);
}
} has no method 'queryAsync'我转储了PromisfyAll函数的结果,果然queryAsync不存在:
相关代码片段:
Client: { [Function] Query: { [Function] super_: [Object] } },
Query:
{ [Function]
super_: { [Function: EventEmitter] listenerCount: [Function] } },
pools:
{ all: {},
Client: { [Function] Query: [Object] },
getOrCreate: [Function] },
Connection:
{ [Function]
super_: { [Function: EventEmitter] listenerCount: [Function] } },
types:
{ getTypeParser: [Function],
setTypeParser: [Function],
arrayParser: { create: [Function] } },
ClientAsync: { [Function: ClientAsync] __isPromisified__: true },
endAsync: { [Function: endAsync] __isPromisified__: true },
connectAsync: { [Function: connectAsync] __isPromisified__: true },
cancelAsync: { [Function: cancelAsync] __isPromisified__: true },
setMaxListenersAsync: { [Function: setMaxListenersAsync] __isPromisified__: true },
emitAsync: { [Function: emitAsync] __isPromisified__: true },
addListenerAsync: { [Function: addListenerAsync] __isPromisified__: true },
onAsync: { [Function: onAsync] __isPromisified__: true },
onceAsync: { [Function: onceAsync] __isPromisified__: true },
removeListenerAsync: { [Function: removeListenerAsync] __isPromisified__: true },
removeAllListenersAsync: { [Function: removeAllListenersAsync] __isPromisified__: true },
listenersAsync: { [Function: listenersAsync] __isPromisified__: true } }它会在解析中找到相关的函数,但不会提供查询:有人知道如何进一步排除这个问题,或者知道使用ClientAsync执行SQL查询的潜在语法吗?我试图从Bluebird github页面上的信息中手动添加pg query.js文件,但无济于事。
发布于 2014-07-02 10:19:03
事实证明,在使用Promisfy时,Javascript和原生绑定库是不同的。
var pg = require('pg');
var Promise = require('bluebird');
var db = Promise.promisifyAll(pg);
var connectionString = "postgres://node:node@localhost:5432/postgres";
db.connectAsync("postgres://node:node@localhost:5432/postgres").spread(function(connection, release) {
return connection.queryAsync("select * from howdy")
.then(function(result) {
console.log("rows", result.rows);
})
.finally(function() {
release();
});
});工作,而这是:
var pg = require('pg').native;
var Promise = require('bluebird');中断与丑陋的错误消息。
我想我最终需要在不同的选项(bluebird w/promisfy和JS-bindings与C-bindings (libpq)和手动承诺)之间做一些基准测试。
发布于 2015-04-15 00:56:48
如果您想最大限度地利用Promises/A+架构,同时将PG library和Bluebird结合在一起,请尝试pg-promise。
如果使用得当,手动代理几乎不会给数据库带来promises所能提供的好处,比如连接管理、自动事务等。
为了给你一个概念,这里是一个完整的事务在pg-promise中的样子,很好地隐藏了连接和事务细节:
db.tx(function () {
return this.batch([
this.query("update users set active=$1 where id=$2", [true, 123]),
this.query("insert into audit(status, id) values($1, $2)", ['active', 123])
]);
})
.then(function (data) {
// success;
}, function (reason) {
// error;
});同样的逻辑通过手动简化的版本会更长很多倍,也更复杂。实际上,您仍然需要执行以下所有操作:
如果您的查询是关闭的,请根据您的查询将connection;
BEGIN successfully;BEGIN COMMIT ROLLBACK BEGINCOMMITROLLBACKBEGINsuccessfully;BEGINCOMMITROLLBACK successful;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGINsuccessfully;BEGIN现在,考虑嵌套事务:)
发布于 2016-02-25 23:29:24
在Manually promisifying pg.connect with Bluebird上,bluebird的创建者回答了相关问题。我已经偷偷地修改了这个解决方案。
var Promise = require('bluebird');
var pg = require('pg');
Object.keys(pg).forEach(function (key) {
var Cls = null;
try {
Cls = pg[key];
if (typeof Cls === 'function') {
Promise.promisifyAll(Cls.prototype);
Promise.promisifyAll(Cls);
}
} catch (e) {
console.log(e);
}
});
Promise.promisifyAll(pg);这里的'pg[key]封装在try-catch块中,因为pg[key]可以在尝试访问error时返回pg['native']
https://stackoverflow.com/questions/24484644
复制相似问题