Как динамически создавать пулы соединений PostgreSQL в node.js используя пакет node-postgres и экспортируйте их для использования

#javascript #node.js #postgresql #node-postgres

#javascript #node.js #postgresql #node-postgres

Вопрос:

У меня есть приложение, в котором мне нужно создать новую базу данных для новой компании, которая подписывается на использование этого приложения. Итак, я поддерживаю основную базу данных, в которой хранится этот список компаний и их соответствующие имена баз данных. Теперь, когда новой компании необходимо использовать это недавно подписанное приложение, мне нужно создать новое Pool для их базы данных для использования. Как создать его программно и экспортировать в node.js ?

Я попробовал способ. Я думал, что пул — это простой объект, поэтому я попытался создать его после создания базы данных и сохранить его в главной базе данных и пытался использовать этот объект пула всякий раз, когда это требуется (мне достаточно одного пула, и я не хочу отключать пул, поскольку он должен работать 24/7, чтовот почему я его сохранил). Но я потерпел неудачу со следующим заявлением об ошибке, когда попытался подключиться к нему

TypeError: myPool.connect is not a function

потому что, как только я сохраняю его как jsonb в masterdb, он больше не является пулом.

Предложения о том, как подойти к этому, будут полезны.

Комментарии:

1. из документов просто создайте новый пул (config) и передайте host, user, timeout и т. Д., И у вас есть новый объект пула. вы можете создать любую функцию и просто вернуть ее из этой функции. если yourPool.connect не является функцией, вероятно, yourPool не является пулом. : P

2. Мой вопрос заключался в том, как создать этот пул программно и экспортировать его для других файлов. Я не должен создавать пул каждый раз, когда хочу его использовать. Мне нужно создать его один раз при создании новой базы данных и экспортировать ее. Мне также нужно иметь доступ к предыдущим пулам. В принципе, мне нужно несколько пулов, которые где-то хранятся и экспортируются.

Ответ №1:

 // eg. poolBuilder
const { Pool } = require('pg')

const pools = new Map();
function getPool(companyName){
   if(!pools.has(companyName){
     pools.set(companyName,  new Pool({
      host: 'localhost',
      user: 'database-user',
      max: 20,
      idleTimeoutMillis: 30000,
      connectionTimeoutMillis: 2000,
    }))
   }
   return pools.get(companyName);
}

module.exports.getPool = getPool;
  
 const {getPool} = require("poolBuilder");

const pool = getPool();
  

Комментарии:

1. Трюк заключается !pool в том, чтобы не создавать пул более одного раза. Спасибо. Теперь я сделаю эту переменную пула объектом и сделаю if(pool.companyName === undefined) в вашем коде и return pool.companyName . Это правильно?

2. да. если вам нужно больше пулов, вы можете сохранить их в object или, что более правильно, в качестве dictionary, это означает new Map() . но это может быть и object