2015-12-20 6 views
12

कहां प्रारंभ करना चाहिए, मैंने अभी nodejs-postgres सीखना शुरू किया और pg-promise पैकेज पाया। मैंने दस्तावेज़ और उदाहरण पढ़े लेकिन मुझे समझ में नहीं आया कि मुझे प्रारंभिक कोड कहां रखना चाहिए? मैं एक्सप्रेस का उपयोग कर रहा हूं और मेरे पास कई मार्ग हैं।मुझे पीजी-वादा

मुझे प्रत्येक प्रारंभिक फ़ाइल (pg-monitor init सहित) को प्रत्येक फ़ाइल में रखना होगा जहां मैं डीबी से पूछताछ करना चाहता हूं या मुझे केवल सर्वर.जेएस में initalize/configure शामिल करना होगा?

अगर मैंने उन्हें केवल सर्वर में शुरू किया। Js मुझे अन्य फ़ाइलों को शामिल करना चाहिए जहां मुझे डीबी क्वेरी चाहिए?

दूसरे शब्दों में। यह मुझे स्पष्ट नहीं है कि अगर पीजी-वादा और पीजी-मॉनीटर configuration/initalization वैश्विक या स्थानीय कार्रवाई थी?

यह भी अस्पष्ट है कि मुझे प्रत्येक क्वेरी के लिए डीबी चर और अंत पीजीपी बनाने की आवश्यकता है?

var db = pgp(connection); 

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

उत्तर

21

आपको केवल एक बार डेटाबेस कनेक्शन प्रारंभ करना होगा। यह मॉड्यूल के बीच साझा करने के लिए है, तो यह अपने आप ही मॉड्यूल फ़ाइल में डाल दिया, इस तरह:

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

अद्यतन

और अगर आप एक से अधिक डेटाबेस वस्तु एक ही कनेक्शन विवरणों के साथ, पुस्तकालय उत्पादन कंसोल में एक चेतावनी बनाने जाएगा कोशिश:

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 
+0

धन्यवाद, अब यह स्पष्ट है। Pgp.end के बारे में क्या? क्या मुझे इसे प्रत्येक प्रश्न के अंत में रखना चाहिए? – ggabor

+0

@ggabor बिल्कुल नहीं! देखें [लाइब्रेरी डी-प्रारंभिकरण] (https://github.com/vitaly-t/pg-promise#library-de-initialization) –

1

@ggabor ए 'कनेक्शन "पीजीपी में वास्तव में कई कनेक्शनों का एक ऑटो-प्रबंधित पूल है। प्रत्येक बार जब आप अनुरोध करते हैं, तो पूल से एक कनेक्शन पकड़ा जाएगा, खोला जाएगा, इस्तेमाल किया जाएगा, फिर बंद कर दिया जाएगा और पूल में वापस आ जाएगा। यह एक बड़ा हिस्सा है कि क्यों vitaly-t आपके पूरे ऐप के लिए केवल एक उदाहरण पीजीपी बनाने के बारे में इतना बड़ा सौदा करता है। अपने कनेक्शन को समाप्त करने का एकमात्र कारण यह है कि यदि आप निश्चित रूप से डेटाबेस का उपयोग कर रहे हैं, यानी आप अपने ऐप को गहन रूप से बंद कर रहे हैं।

+0

यही कारण नहीं है कि चेतावनी है।इसका कारण यह है क्योंकि 1) यह एक डिज़ाइन विरोधी पैटर्न है, उसी कनेक्शन के साथ डेटाबेस को फिर से शुरू करना 2) प्रत्येक डेटाबेस ऑब्जेक्ट को इसकी विस्तारशीलता को अलग-अलग प्राप्त और संभालती है। ईवेंट [विस्तार] देखें (http://vitaly-t.github.io/pg-promise/global.html#event:extend), जो प्रोटोकॉल असंगत बना सकता है। –