не удается получить результаты из postgres в nodejs, если вызывается из вложенной функции

#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> {