установка переменной сеанса для пользователя в pg-обещании - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь установить переменную уровня сеанса для соединения в pg-promise, значение переменной будет считываться триггером на уровне базы данных с помощью current_setting ('var_name'). Эта переменная сеанса будет отличаться для каждого пользователя, хотя я также использую одно и то же соединение с базой данных для всех пользователей.

Я нашел этот несколько связанный вопрос с использованием события подключения, но у меня есть беспокоиться о том, что, поскольку я разделяю одно и то же соединение для всех пользователей, переменная сеанса не будет установлена ​​правильно, когда разные пользователи вызывают метод запроса.

Есть ли другой способ безопасно установить эту переменную сеанса и убедиться, что он изолирован для каждого пользователя, но все еще использует один и тот же объект базы данных?

const pgPromise = pgp({
  promiseLib: Promise, // overriding the default (ES6 Promise)
  async connect(client, dc, useCount) {
    // const cp = client.connectionParameters;
    // console.log('Connected to database:', cp.database, dc);
    if (dc && dc.email) {
      console.log(useCount);
      const email = encodeURI(dc.email);
      await client.query(`SET SESSION "app.user" = '${email}'`);
    }
  }
});

get tenantDb() {
  const state = this.request.sessionState();
  const config = { host, database, port };
  // pass state as database context, 
  // we'll get warning of duplicate database object for the same connection
  const connection = pgPromise(config, state);
  return connection;
}

Обновление

Получается, что мне нужно обновить версию pg-обещания до последней версии, я использовал v7 который не дифференцирует объект соединения в зависимости от контекста, как только я обновлю pg-обещание до v10, предупреждение исчезнет, ​​более оптимальным решением было бы, если бы мы могли как-то установить параметры сеанса вместе с обратным вызовом схемы в параметре initOptions, когда мы инициировать базу данных, таким образом, нам нужен только один дополнительный запрос выполнение вместе со схемой.

...