1

私は pg ライブラリで bluebird の約束を使用しようとしてきましたが、この投稿を見つけましたが、悲しいことに、私は StackOverflow ユーザーに慣れていないため、そこに直接コメントすることはできません

簡単に言えば、そのコードのカット アンド ペーストを行った後に bluebird Promisfy 関数で試したすべてのことは、クエリ コンストラクターのいずれも取得しません。私が試したすべての結果が次のようなバリエーションになるため、これが迅速かつ簡単な助けになることを願っています。

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 ファイルを手動で追加しようとしましたが、役に立ちませんでした。

4

3 に答える 3

3

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 バインディングと C バインディング (libpq)、および手動の約束) の間でベンチマークを行う必要があると思います。

于 2014-07-02T02:19:02.690 に答える
2

PG ライブラリBluebirdを結合しながらPromises/A+アーキテクチャを最大限に活用したい場合は、pg-promiseを試してください。

手動の約束は、接続管理、自動トランザクションなどのように、適切に使用された場合、約束がデータベースに提供できる利点をほとんど与えません。

アイデアを提供するために、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;
    });

そして、手動で約束されたバージョンを介したまったく同じロジックは、何倍も長くなり、はるかに複雑になります。実際には、次のすべてを行う必要があります。

  • 接続を開きます。
  • 接続が成功したことを確認します。
  • BEGINコマンドを実行します。
  • 一連のクエリを実行します。
  • クエリが成功したかどうかを確認します。
  • クエリの成功に基づいて、COMMITまたはのいずれかを実行します。ROLLBACK
  • トランザクションが正常に終了したことを確認します。
  • 接続を解放してプールに戻します。
  • さらに処理するために結果を返します。

ここで、ネストされたトランザクションを検討してください:)

于 2015-04-14T16:56:48.033 に答える
0

bluebirdここで関連する質問に答えたの作成者手動で pg.connect with 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-catchpg[key]errorpg['native']

于 2016-02-25T15:29:23.767 に答える