2015-12-20 3 views
12

Я только начал изучать nodejs-postgres и нашел pg-promise. Я прочитал документы и примеры, но я не понимаю, где я должен поставить код инициализации? Я использую Express, и у меня много маршрутов.Где я должен инициализировать pg-prom

Я должен положить всю инициализацию (включая pg-monitor init) в каждый файл, где я хотел бы запросить db или мне нужно включить и initalize/configure их только в server.js?

Если я инициализировал их только в server.js, то что я должен включить в другие файлы, где мне нужен запрос db?

Иными словами. Неясно мне, если pg-обещание и pg-monitor configuration/initalization были глобальными или локальными действиями?

Также неясно, нужно ли мне создать переменную db и конец pgp для каждого запроса?

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 делает такое большое дело только для создания одного экземпляра pgp для всего вашего приложения. Единственная причина, по которой вы закончите свое соединение, - это то, что вы определенно сделали с использованием базы данных, то есть вы изящно закрываете свое приложение.

+0

Это не причина предупреждения.Причина в том, что 1) Это анти-шаблон дизайна, повторная инициализация базы данных с тем же соединением. 2) Каждый объект базы данных получает и обрабатывает его расширяемость отдельно. См. Событие [extend] (http://vitaly-t.github.io/pg-promise/global.html#event:extend), который может сделать протокол непоследовательным. –