2016-03-20 19 views
16

pg-promiseモジュールを使用してpostgresデータベースに接続するエクスプレスアプリケーションを構築しています。アプリケーション起動時のpg-promiseによるデータベース接続の確認

アプリケーションサーバーの起動時にデータベース接続が正常に行われるようにしたいと考えています。言い換えれば、データベースへの接続が失敗した場合、私はエラーを投げたいと思います。次のように

マイserver.jsファイルには、次のとおりです。

const express = require("express"); 

const databaseConfig= { 
    "host": "localhost", 
    "port": 5432, 
    "database": "library_app", 
    "user": "postgres" 
}; 

const pgp = require("pg-promise")({}); 
const db = pgp(databaseConfig); 

const app = express(); 
const port = 5000; 

app.listen(port, (err) => { 
    console.log(`running server on port: ${port}`); 
}); 

現在の設定に関係なくデータベース接続は、私が望む動作ではありませんこれは、有効であるかどうかの明示サーバーを開始します。

ドキュメントを閲覧しようとしましたが、解決策が見つかりませんでした。私もconst db = pgp(databaseConfig).catch((err) => { // blow up });を試しましたが、それはうまくいきませんでした。pgpが約束を返さないからです。

+0

それは、ここに答えた:https://github.com/vitaly-t/pg-promise/issues/81 –

答えて

30

私はpg-promiseの著者です;)これは初めてこの質問がされたわけではありませんので、ここで詳しく説明します。

あなたはこのような新しいデータベースオブジェクトインスタンス化:

const db = pgp(connection); 

を...それがないすべて - オブジェクトを作成し、それが接続しようとしません。ライブラリは接続プールの上に構築され、実際のクエリメソッドだけがプールからの接続を要求します。

From the official documentation

オブジェクトdb、すなわちのみ実際のクエリ方法を取得して接続を解放し、怠惰なデータベース接続と、データベース・プロトコルを表します。したがって、接続の詳細ごとに1つのグローバル/共有dbオブジェクトを作成する必要があります。

ただし、図に示すように、connectメソッドを使用して、クエリを実行せずに接続するようにライブラリに依頼することができます。

Tasksのサポートが(より安全なアプローチとして)導入されて以来、これはもはや接続を一般的に便利にチェックしています。

私は自分のポストから例をコピー:あなたはより良い好きな方アプローチを選択することができますので、以下https://github.com/vitaly-t/pg-promise/issues/81

は、同時に2つの方法でそれをやった例です。

const initOptions = { 
    // global event notification; 
    error: (error, e) => { 
     if (e.cn) { 
      // A connection-related error; 
      // 
      // Connections are reported back with the password hashed, 
      // for safe errors logging, without exposing passwords. 
      console.log('CN:', e.cn); 
      console.log('EVENT:', error.message || error); 
     } 
    } 
}; 

const pgp = require('pg-promise')(initOptions); 

// using an invalid connection string: 
const db = pgp('postgresql://userName:[email protected]:port/database'); 

db.connect() 
    .then(obj => { 
     obj.done(); // success, release the connection; 
    }) 
    .catch(error => { 
     console.log('ERROR:', error.message || error); 
    }); 

出力:

CN: postgresql://userName:########@host:port/database EVENT: getaddrinfo ENOTFOUND host host:5432 ERROR: getaddrinfo ENOTFOUND host host:5432

すべてのエラーライブラリーでは、最初のグローバルerrorイベントハンドラによって報告され、その後にのみエラーが対応する.catchハンドラ内で報告されます。

db.proc('version') 
    .then(data => { 
     // SUCCESS 
     // data.version = 
     // 'PostgreSQL 9.5.1, compiled by Visual C++ build 1800, 64-bit' 
    }) 
    .catch(error => { 
     // connection-related error 
    }); 

APIリンク:代わりに手動で接続を確立する

代替

は、単に1次のように、常に有効な接続のために成功するクエリの種類を実行することができ

+0

はあなたの応答のためのヴィタリー・トン@ありがとうございます。これはまさに私が探していたものです。 –

+0

実際の接続プールを取得するにはどうすればよいですか? ppolを望むサードパーティ製のlibがあり、私はpg-promise接続と並んで2番目の接続を設定したくないと思います。 – retorquere

+1

@retorquereこの答えが書かれたとき、接続プールのようなものはありませんでした。現在リリースされているバージョンは5.9.5です。これは引き続きドライバv5.1を使用しています。これは共有する外部プールがなく、グローバル内部プールが1つしかありません。バージョン6.xでは、[db。$ pool](http://vitaly-t.github.io/pg-promise/Database.html#.$pool)からアクセスできる接続プールとともに最新のドライバを使用します。 。 –

関連する問題