2015-12-20 27 views
12

nodejs-postgresを学び始めて、pg-promiseパッケージが見つかりました。 ドキュメントとサンプルを読みましたが、初期化コードをどこに置くべきか分かりません。 Expressを使っていて、私には多くのルートがあります。pg-promiseを初期化する必要があります

初期化(pg-monitor initを含む)をデータベースに照会したいすべてのファイルに入れなければなりません。それとも、includeする必要がありますか?initalize/configureのみをserver.jsに入れる必要がありますか?

私がそれらをserver.js内でのみ初期化したのであれば、dbクエリが必要な場所に他のファイルを含めるべきですか?

つまり、 pg-promiseとpg-monitor configuration/initalizationがグローバルまたはローカルのアクションであったかどうかはわかりません。

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

var db = pgp(connection); 

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

答えて

21

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

const initOptions = { 
    // initialization options; 
}; 

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

const cn = 'postgres://username:[email protected]:port/database'; 
const db = pgp(cn); 

module.exports = { 
    pgp, db 
}; 

を見るにはInitialization Optionsを支持しました。

UPDATES

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

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経由でアクセスできる場合:PGPでA「接続」@ggabor

const db = require('../db'); // your db module 
const pgp = db.$config.pgp; // the library's root after initialization 
+0

ありがとうございました。 pgp.endはどうですか?すべての単一クエリの最後にそれを置くべきですか? – ggabor

+0

@ggabor絶対にありません! [Library de-initialization](https://github.com/vitaly-t/pg-promise#library-de-initialization) –

1

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

+0

これは警告がそこにある理由ではありません。その理由は、1)設計上の反パターンであり、同じ接続でデータベースを再初期化するためです。2)各データベースオブジェクトは、それぞれの拡張性を個別に受け取り、処理します。イベント[extend](http://vitaly-t.github.io/pg-promise/global.html#event:extend)を参照してください。プロトコルが矛盾する可能性があります。 –

関連する問題