web-dev-qa-db-ja.com

pg-promiseはどこで初期化する必要がありますか

私は_nodejs-postgres_を学び始め、_pg-promise_パッケージを見つけました。ドキュメントと例を読みましたが、初期化コードをどこに配置すればよいのかわかりません。 Expressを使用していて、ルートがたくさんあります。

すべての初期化(_pg-monitor_ initを含む)を、dbにクエリを送信するすべての単一ファイルに配置する必要がありますか、それとも、server.jsにのみ_initalize/configure_を含める必要がありますか?

Server.jsでのみ初期化した場合、dbクエリが必要な他のファイルを含めるにはどうすればよいですか?

言い換えると。 pg-promiseとpg-monitor _configuration/initalization_がグローバルなアクションなのか、ローカルなアクションなのかはわかりません。

Db変数を作成してすべてのクエリに対してpgpを終了する必要があるかどうかも不明ですか?

_var db = pgp(connection);

db.query(...).then(...).catch(...).finally(**pgp.end**);
_
15
ggabor

データベース接続を初期化する必要があるのは1回だけです。モジュール間で共有する場合は、次のように独自のモジュールファイルに入れます。

_const initOptions = {
    // initialization options;
};

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

const cn = 'postgres://username:password@Host:port/database';
const db = pgp(cn);

module.exports = {
    pgp, db
};
_

サポートされている 初期化オプション を参照してください。

[〜#〜]更新[〜#〜]

そして、同じ接続詳細で複数のデータベースオブジェクトを作成しようとすると、ライブラリはコンソールに警告を出力します。

WARNING: Creating a duplicate database object for the same connection. at Object.<anonymous> (D:\NodeJS\tests\test2.js:14:6)

これは、データベースの使用パターンが悪いことを示しています。つまり、上記のようにデータベースオブジェクトを共有し、最初から作成し直す必要はありません。また、バージョン6.x以降では、各データベースオブジェクトが独自の接続プールを維持することが重要になったため、それらを複製すると、接続の使用率が低下します。


また、pgp-初期化されたライブラリインスタンスをエクスポートする必要はありません。代わりに、次のようにすることができます。

_module.exports = db;
_

また、一部のモジュールでライブラリのルートを使用する必要がある場合は、プロパティ $ config を使用してアクセスできます。

_const db = require('../db'); // your db module
const pgp = db.$config.pgp; // the library's root after initialization
_
33
vitaly-t

Pgpの「接続」は、実際には複数の接続の自動管理プールです。リクエストを行うたびに、プールから接続が取得され、開かれ、使用され、閉じられてプールに返されます。アプリ全体でpgpのインスタンスを1つだけ作成することについてvitaly-tが非常に重要である理由は、これが大きな部分です。接続を終了する唯一の理由は、データベースの使用が確実に終了した場合、つまり、アプリを正常にシャットダウンした場合です。

2
skylize