#node.js #database #postgresql #pgpool
Вопрос:
У меня есть DB
класс, у которого есть общедоступный статический query
метод. Там может быть сохранено несколько пулов соединений _coonection_pools
, поэтому я создаю случайное число, затем получаю пул и выполняю запрос . это и есть код
static async query(queryInfo: Query): Promise<any> {
const query = `select * from ${queryInfo.name} ${queryInfo.arguments} as info;`;
try {
return this._queryReplicaDB(queryInfo);
} catch (err) {
console.log("err", err);
throw err;
}
}
static async _queryReplicaDB(query: Query): Promise<any> {
const randomNumber = Math.floor(Math.random() * this._connection_pools.length);
// get the pool using random number
const pool = this._connection_pools[randomNumber];
try {
const response = await pool.query(query);
return response.rows[0].info;
} catch {
let response;
// if replica db fails then try with other pools
for (let i = 0; i < this._connection_pools.length; i ) {
// iterrate through every pool
const pool = this._connection_pools[i];
try {
response = await pool.query(query);
break;
} catch {
console.log("Error in Pool index: ", i);
}
}
return response.rows[0].info;
}
}
Это возвращает пустое rows
значение в массиве ответов
но если вместо вызова вложенного _queryReplicaDB
объекта это работает нормально
static async query(queryInfo: Query): Promise<any> {
const query = `select * from ${queryInfo.name} ${queryInfo.arguments} as info;`;
try {
const response = await this._connection_pools[0].query(query);
return response.rows[0].info;
} catch (err) {
console.log("err", err);
throw err;
}
}
я тоже пробовал this._connection_pools[0]
_queryReplicaDB
, но это не работает.
Я попробовал случайную вещь с числами непосредственно в query
методе, в этом методе это работает.
в чем может быть проблема?
Комментарии:
1. В 1-й функции запроса вы создаете запрос и не передаете его, а вместо этого передаете queryInfo. Это нарочно?
2. @RaniSharim, спасибо, да, это сработало, я передавал не тот объект
Ответ №1:
В моем случае код был правильным, просто я передавал неправильный тип объекта. Вместо передачи объекта запроса
static async _queryReplicaDB(query: Query): Promise<any> {
эта функция должна принимать строковый тип в качестве запроса
static async _queryReplicaDB(query: string): Promise<any> {