私は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
}
リンク