2015-12-20 21 views
12

Ho appena iniziato a studiare nodejs-postgres e ho trovato il pacchetto pg-promise. Ho letto i documenti e gli esempi ma non capisco dove dovrei inserire il codice di inizializzazione? Uso Express e ho molti percorsi.Dove dovrei inizializzare pg-promise

Devo inserire l'intera inizializzazione (incluso pg-monitor init) in ogni singolo file in cui desidero interrogare il db o devo includere e initalize/configure solo nel server.js?

Se li ho inizializzati solo nel server.js, cosa dovrei includere altri file in cui ho bisogno di una query db?

In altre parole. Non è chiaro per me se pg-promise e pg-monitor configuration/initalization sono stati un'azione globale o locale?

Non è ancora chiaro se è necessario creare una variabile db e terminare pgp per ogni singola query?

var db = pgp(connection); 

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

risposta

21

È necessario inizializzare la connessione al database una sola volta. Se deve essere condiviso tra i moduli, poi metterlo in un proprio file del modulo, in questo modo:

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 
}; 

vedere Supporti Initialization Options.

AGGIORNAMENTI

E se si tenta di creare più di un oggetto di database con gli stessi dettagli della connessione, la biblioteca uscita un avvertimento nella console:

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

Questo sottolinea che il tuo modello di utilizzo del database è negativo, ovvero dovresti condividere l'oggetto del database, come mostrato sopra, non ricrearlo di nuovo. E dalla versione 6.x è diventato fondamentale, con ogni oggetto del database che gestisce il proprio pool di connessioni, quindi la duplicazione di tali file si tradurrebbe in una scarsa connessione.


Inoltre, non è necessario esportare pgp - inizializzato esempio biblioteca. Invece, basta che si può fare:

module.exports = db; 

E se qualche modulo è necessario utilizzare radice della biblioteca, è possibile accedervi tramite proprietà $config:

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

Grazie, è chiaro ora. Che mi dici del pgp.end? Dovrei metterlo alla fine di ogni singola query? – ggabor

+0

@ggabor assolutamente NO! Vedi [Deinizializzazione della libreria] (https://github.com/vitaly-t/pg-promise#library-de-initialization) –

1

@ggabor A "collegamento" in PGP è in realtà un pool autogestito di più connessioni. Ogni volta che si effettua una richiesta, una connessione verrà prelevata dal pool, aperta, utilizzata, quindi chiusa e restituita al pool. Questa è una parte importante del perché vitaly-t fa un grande affare sulla creazione di una sola istanza di pgp per l'intera app. L'unica ragione per terminare la connessione è se hai definitivamente finito di usare il database, cioè stai chiudendo con grazia la tua app.

+0

Questo non è il motivo per cui l'avviso è presente.Il motivo è perché 1) È un design anti-pattern, reinizializzando il database con la stessa connessione 2) Ogni oggetto di database riceve e gestisce separatamente la sua estensibilità. Vedere l'evento [estendere] (http://vitaly-t.github.io/pg-promise/global.html#event:extend), che può rendere il protocollo incoerente. –

Problemi correlati