首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs、postgres和bluebird

nodejs、postgres和bluebird
EN

Stack Overflow用户
提问于 2014-06-30 15:09:25
回答 3查看 2.8K关注 0票数 1

我一直试图在pg库中使用bluebird promises,甚至找到了这篇文章,但遗憾的是,我是一个StackOverflow新手,不能直接在那里发表评论:Manually promisifying pg.connect with Bluebird

简而言之,在对bluebird Promisfy函数进行剪切和粘贴之后,我尝试的所有操作都没有引入任何查询构造函数,也许我在尝试时误用了ClientAsync函数,但我希望这是一个快速而简单的帮助,因为我尝试的所有操作都会产生以下变化:

代码语言:javascript
复制
Possibly unhandled TypeError: Object function (err) {
      if(err) {
        pool.destroy(client);
      } else {
        pool.release(client);
      }
    } has no method 'queryAsync'

我转储了PromisfyAll函数的结果,果然queryAsync不存在:

相关代码片段:

代码语言:javascript
复制
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文件,但无济于事。

EN

回答 3

Stack Overflow用户

发布于 2014-07-02 10:19:03

事实证明,在使用Promisfy时,Javascript和原生绑定库是不同的。

代码语言: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();
     });
});

工作,而这是:

代码语言:javascript
复制
var pg = require('pg').native;
var Promise = require('bluebird');

中断与丑陋的错误消息。

我想我最终需要在不同的选项(bluebird w/promisfy和JS-bindings与C-bindings (libpq)和手动承诺)之间做一些基准测试。

票数 3
EN

Stack Overflow用户

发布于 2015-04-15 00:56:48

如果您想最大限度地利用Promises/A+架构,同时将PG libraryBluebird结合在一起,请尝试pg-promise

如果使用得当,手动代理几乎不会给数据库带来promises所能提供的好处,比如连接管理、自动事务等。

为了给你一个概念,这里是一个完整的事务在pg-promise中的样子,很好地隐藏了连接和事务细节:

代码语言:javascript
复制
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;

  • Check connection success;

  • Check successfully;

  • Release
  • BEGIN successfully;
  • Release
    • success;
    • Check successfully;
    • Release
      • BEGIN COMMIT ROLLBACK
      • success;
      • Check successfully;
      • Release
        • BEGINCOMMITROLLBACK
        • success;
        • Check successfully;
        • Release
          • BEGINsuccessfully;
          • Release
          • BEGINCOMMITROLLBACK successful;
          • Execute success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • success;
          • Check successfully;
          • Release
          • BEGINsuccessfully;
          • Release
          • to success;
          • Check successfully;
          • Release
          • BEGIN

现在,考虑嵌套事务:)

票数 2
EN

Stack Overflow用户

发布于 2016-02-25 23:29:24

Manually promisifying pg.connect with Bluebird上,bluebird的创建者回答了相关问题。我已经偷偷地修改了这个解决方案。

代码语言:javascript
复制
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']

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24484644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档