Я пытаюсь установить переменную уровня сеанса для соединения в 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, когда мы инициировать базу данных, таким образом, нам нужен только один дополнительный запрос выполнение вместе со схемой.