Возврат результата запроса node-postgres

Я пытаюсь вернуть результат запроса node-postgres и сохранить его в переменной. Я могу нормально управлять console.log, но не могу найти способ вернуть результат, чтобы он был доступен вне метода запроса. Я в растерянности и знаю, что мне, должно быть, не хватает чего-то очевидного (или нескольких очевидных вещей), потому что, если это невозможно сделать, я не понимаю смысла node-postgres, поскольку все, что я когда-либо смогу сделать, это записать мои результаты в консоль.

Я пробовал приведенный ниже код вместе с версией, использующей обещания, и оба получили один и тот же результат - undefined. Console.log внутри else работает нормально, но возврат не делает результат доступным для остальной части функции. В приведенном ниже коде мой возврат возвращается как «undefined», как и вместо него console.log.

var selectFrom = function(data, table, condition) {
    var queryResult;
    pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
        if(err) { console.log(err); }
        else { queryResult = result.rows[0][data]; }
    })
    pool.end();
    return queryResult;
}

var result = selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`);
console.log(result);

person NJerseyBoy    schedule 06.10.2019    source источник
comment
Ваш return queryResult возвращается до того, как запрос будет выполнен. Вам нужно как-то дождаться результатов из БД, прежде чем возвращать их. Прочтите об async / await или, возможно, верните обещание, которое разрешено с результатом из БД.   -  person ahwayakchih    schedule 06.10.2019


Ответы (3)


Это то, что вы ищете:

async function selectFrom(data, table, condition) {
  try {
    const res = await pool.query(
      `SELECT ${data} FROM ${table} ${condition}`
    );
    return res.rows[0][data];
  } catch (err) {
    return err.stack;
  }
}

Помимо предыдущей функции:

async function whateverFuncName () {
   var result = await selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`);
   console.log(result);
}

РЕДАКТИРОВАТЬ: я не запускал этот фрагмент кода, но основная концепция довольно проста.

person Crepkey    schedule 20.02.2020

Метод «запроса» - это асинхронный вызов, вы должны использовать async / await или Promise.

С async / await:

await client.connect()
const res = await client.query("SELECT amount FROM total_nonfarm_monthly_sa WHERE month='2019-08-31'");
console.log(res.rows[0]);
await client.end();

Изменить: я вижу, что есть возможность обратного вызова, но я бы использовал async / await

person Elad    schedule 06.10.2019
comment
Извините, это только часть кода? При вводе только этого я получаю сообщение об ошибке, которое допустимо только в асинхронной функции. - person NJerseyBoy; 07.10.2019
comment
когда вы помещаете его в свою функцию, убедитесь, что в его объявлении есть async, например: async function myFunc () {await ...} - person Elad; 07.10.2019

Вам нужно использовать обратные вызовы:

var selectFrom = function(data, table, condition, callback) {

    pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
        if(err)
            return callback(err);
        callback(null, result.rows[0][data]);
    })
    pool.end();
}

selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`, function(err, result){
    console.log(err, result);   
});

или обещает:

var selectFrom = function(data, table, condition) {
    return new Promise(function(resolve, reject){
        pool.query(`SELECT ${data} FROM ${table} ${condition}`, function(err, result) {
            if(err)
                return reject(err);
            resolve(result.rows[0][data]);
        })
        pool.end();
    });
}

selectFrom('amount','total_nonfarm_monthly_sa', `WHERE month='2019-08-31'`)
.then(function(result){
    console.log(result);    
}).catch(function(err){
    console.log(err);   
});
person Molda    schedule 06.10.2019
comment
Спасибо, оба этих подхода позволили мне записать значение с помощью функции selectFrom. К сожалению, я все еще не понимаю, как сохранить значение в переменной. Я попытался установить переменную, равную selectFrom, возвращая «результат» вместо того, чтобы регистрировать его, а также возвращал объект, для которого результат был установлен как значение свойства. В обоих случаях результат «не определен». - person NJerseyBoy; 07.10.2019