38

pg-promiseモジュールを使用して postgres データベースに接続する高速アプリケーションを構築しています。

アプリケーション サーバーを起動するときに、データベース接続が成功することを確認したいと思います。つまり、データベースへの接続に失敗した場合は、エラーをスローしたいと考えています。

私の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}`);
});

現在の構成では、データベース接続が有効かどうかに関係なくExpress サーバーが起動しますが、これは私が望む動作ではありません。

ドキュメントを参照してみましたが、解決策が見つかりませんでした。私も試しました

const db = pgp(databaseConfig).catch((err) => { // blow up });

しかしpgp、約束を返さないため、うまくいきませんでした。

4

2 に答える 2

81

私はpg-promiseの作成者です ;) そして、この質問が尋ねられるのはこれが初めてではないので、ここで詳細な説明をします。

次のように新しいデータベース オブジェクトをインスタンス化する場合:

const db = pgp(connection);

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

公式ドキュメントから

オブジェクト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:password@host:port/database');
    
db.connect()
    .then(obj => {
        // Can check the server version here (pg-promise v10.1.0+):
        const serverVersion = obj.client.serverVersion;

        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

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

アップデート

接続をテストするための最新のアプローチ + ワンステップでサーバーのバージョンを取得する:

// tests connection and returns Postgres server version,
// if successful; or else rejects with connection error:
async function testConnection() {
    const c = await db.connect(); // try to connect
    c.done(); // success, release connection
    return c.client.serverVersion; // return server version
}

リンク

于 2016-03-21T04:58:20.140 に答える