Где я должен инициализировать pg-prom

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

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

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

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

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

var db = pgp(connection);

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

Ответ 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
};

См. поддерживаемый Параметры инициализации.

ОБНОВЛЕНИЯ

И если вы попытаетесь создать несколько объектов базы данных с теми же данными о соединении, библиотека выведет предупреждение в консоль:

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

Это указывает на то, что шаблон использования базы данных плох, т.е. вы должны совместно использовать объект базы данных, как показано выше, а не воссоздавать его снова и снова. А начиная с версии 6.x это стало критически важным: каждый объект базы данных поддерживает свой собственный пул подключений, поэтому их дублирование дополнительно приведет к плохому использованию соединения.


Кроме того, нет необходимости экспортировать экземпляр библиотеки pgp - initialized. Вместо этого вы можете просто сделать:

module.exports = db;

И если в каком-то модуле вам нужно использовать корень библиотеки, вы можете получить к нему доступ через свойство $config:

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

Ответ 2

@ggabor "Соединение" в pgp на самом деле является пулом с автоматическим управлением несколькими соединениями. Каждый раз, когда вы делаете запрос, соединение извлекается из пула, открывается, используется, затем закрывается и возвращается в пул. Это большая часть того, почему vitaly-t делает такое большое дело только для создания одного экземпляра pgp для всего вашего приложения. Единственная причина, по которой вы закончите свое соединение, - это то, что вы, безусловно, сделали это с помощью базы данных, т.е. Вы изящно закрываете свое приложение.